728x90
반응형

공공데이터포털 (https://www.data.go.kr/) 에서 api를 호출하려고 하는데

계속해서 서비스키가 등록되지 않았다는 에러가 발생했습니다.

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <header>
        <resultCode>30</resultCode>
        <resultMsg>SERVICE KEY IS NOT REGISTERED ERROR.</resultMsg>
    </header>
</response>

 

만약 계속해서 30번 에러가 발생한다면 2가지 상황을 의심해볼 수 있습니다.

 

1. api제공 업체의 문제
2. uri 호출 방식의 문제

1. 공공데이터포털에서 제공하는 "미리보기" 조차 불가능한 경우

만약 미리보기조차 불가능하다면 코드의 문제보다는 api 제공업체에 정상적으로 키가 등록되지 않은 경우입니다.

 

 

이건 Q&A 문의글을 남겨두면 간단히 해결됩니다.
대신 1~2일의 시간이 요소되기 때문에 다른 코드부터 짜고 계실 것을 추천드립니다.

 

 

실제로 저는 미리보기 조차 안되어서 문의글을 남겼더니 다음날 바로 해결해주셨습니다~
홈페이지에서는 1~2시간 걸린다고 되어 있었는데 하루정도 소요됐네요 ㅎㅎ

 


2. uri 호출 방식의 문제

1) 인코딩 문제

restTemplate.getForObject(uri, String.class) 방식으로 api를 호출할 때,
uri 부분에 String 또는 StringBuilder 데이터타입을 사용하셨나요...?

 

그럼 안됩니다!

 

URL에서 특수 문자는 특정 의미를 가지므로, 예를 들어, 공백()은 %20으로 변환되어야 하는데
String 형식으로 전송하면 공백문자가 %20로 변환되지 않기 때문입니다~

 

따라서 URLEncoder 또는 UriComponentsBuilder 를 사용해서 api를 호출해야
"쿼리 파라미터" 부분이 인코딩되어 HTTP 요청이 올바르게 처리됩니다!!

 

2) 예제코드

package org.dev2ne1.speedalertapi.service;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.IOException;
import java.net.URI;
@RequiredArgsConstructor
@Service
public class TrafficCameraService {

    private final RestTemplate restTemplate;

    @Value("${api.key}") // application.properties에서 api.key 값을 읽어옵니다.
    private String apiKey;

        // API Key 인코딩
        String encodedApiKey = URLEncoder.encode(apiKey, StandardCharsets.UTF_8.toString());
        
        // 기본 URL과 파라미터 설정
        URI uri = UriComponentsBuilder.fromHttpUrl("http://api.data.go.kr/openapi/tn_pubr_public_unmanned_traffic_camera_api")
                .queryParam("serviceKey", encodedApiKey)
                .queryParam("pageNo", 1)
                .queryParam("numOfRows", 100)
                .queryParam("type", "xml")
                .queryParam("latitude", latitude) // 위도
                .queryParam("longitude", longitude) // 경도
                .build(true) // true로 설정하면 자동 인코딩
                .toUri();

        System.out.println("Request URI: " + uri);

        try {
            // 요청 실행 및 결과 반환
            return restTemplate.getForObject(uri, String.class);
        } catch (Exception e) {
            // 예외 처리
            System.err.println("Error while fetching traffic camera data: " + e.getMessage());
            throw new RuntimeException("Failed to fetch traffic camera data", e);
        }
    }
}

 

 

전체 코드 github 링크 : 

https://github.com/devfrom2ne1/speedAlertApi.git

 

GitHub - devfrom2ne1/speedAlertApi: 규정 속도 위반 시, 벌금 금액을 음성 알림으로 내보내는 API서버

규정 속도 위반 시, 벌금 금액을 음성 알림으로 내보내는 API서버. Contribute to devfrom2ne1/speedAlertApi development by creating an account on GitHub.

github.com

 

728x90
반응형
728x90
반응형

환경변수 파일을 수정해주면 됩니다!

1. 터미널 열기

2. 환경변수 파일 수정모드로 진입하기

nano ~/.zshrc  

3. 환경변수 파일 내용 수정하기

export PS1="사용자이름@호스트이름 % "
  • 맨 아랫줄에 위의 내용을 작성해줍니다.
  • <사용자이름>과 <호스트이름> 부분에는 원해는 내용으로 변경하세요~

4. 저장 후 종료

Ctrl + O => Enter => Ctrl + X

5. 적용하기

source ~/.zshrc
728x90
반응형
728x90
반응형

 

공홈 따라하면 우분투에 도커 설치는 식은 중 먹기!

 

1. Docker 설치 공식문서 링크

https://docs.docker.com/engine/install/

 

우선 크롬을 활용하여 공식홈페이지 Install 메뉴얼 페이지에 접속합니다.

 

Install

Learn how to choose the best method for you to install Docker Engine. This client-server application is available on Linux, Mac, Windows, and as a static binary.

docs.docker.com

 

2. 도커를 설치할 OS를 선택하기

 

각자 설치는 원하는 OS를 선택하세요~

저는 우분투라서 우분투 설치 링크를 선택했습니다.

 

그럼 아래와 같이 영어 문서가 나옵니다!

영어 울렁증이 도져서 머리가 어질어질 지끈지끈...닫고 싶어지기 직전에 크롬으로 영한 번역을 시도합시다!

 

 

3. 크롬으로 이 페이지 한국어로 번역하기

주소창 오른쪽 끝 부분에 아래 아이콘 클릭해보세요!

 

그럼 이 페이지를 한국어로 번역해줍니다...헤헤

 

좀 번역이 이상할때는 다시 영어로 바꿔서 보면 됩니다~

영어로 된 개발 공식문서 보기 참 쉽죠잉?

728x90
반응형

728x90
반응형

venv는 python2와 python3를 자유롭게 변경하기 어렵다고 해서 virtualenv로 설치하기로 결심!

설치방법

1. virtualenv 설치

python3 -m pip install --user -U virtualenv

2. virtualenv PATH 설정

echo 'export PATH=$PATH:/Users/컴퓨터명/Library/Python/3.13/bin' >> ~/.zshrc
source ~/.zshrc

3. 파이썬 가상환경 만들기

cd [디렉토리 경로]
virtualenv env

해당 디렉토리로 가면 env 폴더가 생겨있는 것을 확인할 수 있습니다~

4. 가상환경 활성화

cd [디렉토리 경로]
source env/bin/activate

활성화되면 터미널에 (env)가 표시됩니다.

(env) 컴퓨터명@MacBookAir hana-meeting-llm %

5. 가상환경 비활성화

deactivate 명령을 통해 비활성화 할 수 있습니다.

cd [디렉토리 경로]
deactivate

비활성화되면 터미널에 (env)가 표시가 사라집니다.

728x90
반응형
728x90
반응형

1.  도커 컴포즈란?

여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있는 것이다.

 

2. 도커 엔진만 설치해도 될까?

단일 컨테이너를 실행하거나 간단한 테스트만 할 때는 도커 엔진만 설치해도 된다.
예를 들어 백엔드 Springboot 컨테이너 하나 실행해서 서버 테스트만 해볼 때는 도커 컴포즈를 굳이 설치하지 않아도 된다.

 

3. 도커 컴포즈는 왜 설치해야 할까?

여러 컨테이너를 함께 실행하고, 이를 쉽게 관리하려는 경우에 도커 컴포즈를 설치해야 한다. 
예를 들어, 웹 서버(Nginx), 데이터베이스(MySQL), 백엔드 서버(Spring Boot)를 한 번에 관리하고자 할 때는 도커 컴포즈를 설치하여 여러 개의 도커 컨테이너를 하나의 묶음으로 관리할 수 있다. 

 

4. 설치방법(공식문서)

 

설치 방법은 공식문서에 자세히 나와있다. 

 

공식문서 링크

https://docs.docker.com/compose/install/standalone/

 

Install Compose standalone

How to install Docker Compose - Other Scenarios

docs.docker.com

 

실행 권한이 없으면?

ubuntu@ip-172-31-3-15:~$ docker-compose --version

-bash: /usr/local/bin/docker-compose: Permission denied

 

실행권한 주는 법

ubuntu@ip-172-31-3-15:~$ sudo chmod +x /usr/local/bin/docker-compose

ubuntu@ip-172-31-3-15:~$ docker-compose --version

Docker Compose version v2.30.3
728x90
반응형
728x90
반응형

Fastapi 가 편리한 이유

1. 문서 자동화 = Swagger를 사용하지 않아도 된다. 

 

2. nodejs급 빠름

 

3. ASGI를 기반으로 비동기 처리를 지원 (※ ASGI : Asynchronous Server Gateway)

 

4. flask나 django는 동기 통신을 기반으로 하기 때문에 효율이 떨어짐


 

Fastapi 공식 사이트

https://fastapi.tiangolo.com/

 

FastAPI - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

 

728x90
반응형
728x90
반응형

오라클 설치할 수 없을 때 유용하게 사용할 수 있는 'Oracle Apex'

클라우드 환경에서 사용할 수 있는 오라클이라고 생각하면 된다.

 

그래서 설치가 필요가 없다. 그냥 웹사이트 가입만 하면 끝~ 아래 상세 내용을 작성했으니 참고!


'Oracle Apex' 링크  : https://apex.oracle.com/en/learn/getting-started/

 

Getting Started

It takes just a few moments to get started with Oracle APEX. Follow these simple steps and get your free workspace to begin developing apps within minutes.

apex.oracle.com

 

 

'Oracle Apex' 가입 방법

 

Free Sign Up 클릭 !

 

Workspace name은 고유한 본인만의 값을 작성해야 한다! 다른 사람들과 겹치면 안됨

 

정상적으로 입력되면 메일이 한통 온다.

 

Create Workspace 클릭하면 거의 다 끝!

 

마지막으로 저 버튼만 클릭하면 클라우드 환경이 열린다.

 

짜잔! 오라클 설치 없이 맥북유저들도 쉽게 Oracle 실습해보삼

728x90
반응형
728x90
반응형

문제

https://www.acmicpc.net/problem/2606

 

 

풀이 (bfs)

from collections import deque

# 1. 입력받기
n=int(input()) # 컴퓨터 개수
v=int(input()) # 연결선 개수
graph = [[] for i in range(n+1)] # 그래프 초기화

for i in range(v): # 그래프 생성
    a,b=map(int,input().split())
    graph[a]+=[b] # a에 b 연결
    graph[b]+=[a] # b에 a 연결 -> 양방향
    
#print(graph)

# 2. 노드 탐색 (bfs / 큐)
visited = [0] * (n+1) # 방문 여부 체크
visited[1]=1 # 1번 컴퓨터부터 시작이니 방문 표시
Q=deque([1])
while Q:
    c=Q.popleft() # 왼쪽에서 빼기
    for nx in graph[c]:
        if visited[nx]==0:
            Q.append(nx) #오른쪽에 추가
            visited[nx]=1

print(sum(visited)-1)

 

 

풀이 (dfs)

# 1. 입력받기
n = int(input())
v = int(input())
graph = [[] for i in range(n+1)] # 그래프 초기화

for i in range(v):
    a,b = map(int, input().split())
    graph[a] += [b]
    graph[b] += [a]

#print(graph)

visited = [0] * (n+1)

# 2. dfs 함수 구현 (재귀)
def dfs(v):
    visited[v]=1

    for nx in graph[v]:
        if visited[nx]==0:
            dfs(nx)
        #print(f"v={v} | nx={nx} | {visited}")

# 3. 노드 탐색 (dfs / 재귀)
dfs(1)
#print(visited)
print(sum(visited) -1)

 

 

출처

https://bio-info.tistory.com/152

 

[백준] 2606 바이러스 - Python (그래프 탐색)

Contents 1. 문제 정의 및 예제 해석 (문제 링크: https://www.acmicpc.net/problem/2606) 2606번: 바이러스 첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번

bio-info.tistory.com

 

 

728x90
반응형
728x90
반응형

문제

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

[개요]

1. 오른쪽으로 돌다가 끝에 다다르면 아래쪽으로 방향 바꾸기

2. 아래쪽으로 돌다가 끝에 다다르면 왼쪽으로 방향 바꾸기

3. 왼쪽으로 돌다가 끝에 다다르면 위쪽으로 방향 바꾸기

 

[이슈]

끝을 어떻게 판단할 수 있을까?

1. 다음 좌표의 값이 0이 아니어야 함

2. 다음 좌표가 0보다 작거나, n보다 크거나 같으면 끝임

 

[파이썬문법]

1. 리스트 0으로 초기화 : answer = [[0 for i in range(n)] for j in range(n)]

 

 

정답코드

def solution(n):
    answer = [[]]
    answer = [[0 for i in range(n)] for j in range(n)]
    val = 0
    
    #우 하 좌 상
    d = 0
    dx = [0, 1,  0, -1] #행 
    dy = [1, 0, -1,  0] #열
    
    #현재 좌표
    cur = [0,0]
    
    while val < n*n:
        #현재좌표 값 채우기
        val += 1
        answer[cur[0]][cur[1]] = val
        
        #다음 좌표
        x = cur[0] + dx[d]
        y = cur[1] + dy[d]
        next = [x, y]
        #print(f"next={next}")
        
        #다음좌표값이 0보다 크면 방향 바꾸기
        #다음좌표가 맨끝이면 방향바꾸기 
        if (x>n-1 or x<0 or y>n-1 or y<0) or answer[next[0]][next[1]] > 0:
            if d < 3:
                d += 1
            else:
                d = 0
        
        #print(f"d={d}")
        
        #현재좌표를 다음 좌표로 바꾸기
        x = cur[0] + dx[d]
        y = cur[1] + dy[d]
        next = [x, y]
        cur = next
        
        #print(answer)
    
    return answer

 

728x90
반응형

'알고리즘' 카테고리의 다른 글

[백준] 2606 - 바이러스 (python3)  (0) 2024.05.10
[프로그래머스] 옹알이(1)  (0) 2024.03.25
[프로그래머스] 타겟넘버  (0) 2024.01.05
[파이썬] 괄호 짝 확인하기  (0) 2023.12.15
[파이썬] 런던 폭우 Ⅱ  (0) 2023.09.30

+ Recent posts