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
반응형

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
반응형

Springboot에서 기본적으로 사용하고 있는 DB네이빙 룰(DB Physical Naming Strategy)은 아래와 같습니다!

  1. 모든 테이블명은 소문자
  2. 카멜케이스 대문자는 '_'로 대체됨

그럼 이미 대문자로 DB스키마를 설계한 경우, 전부 소문자로 바꿔줘야 할까요?!

 

아닙니다!

 

위의 사진처럼 application.yml 파일에서 JPA의 네이밍 규칙을 모델에 설정된 규칙으로 변경한다고 설정해 주기만 하면 대문자로 테이블을 관리할 수 있습니다!

 

 

Model 클래스에서 Table 명세를 대문자로 해둔 것처럼 JPA가 대문자 테이블을 잘 잡아오는 것을 알 수 있습니다~

 

출처 : 

 

JPA Entity Table 대소문자 네이밍 에러

문제 발생 JPA를 통해 Entity를 생성할 때 name 속성으로 "USER_TB" 이렇게 대문자로 지정해줬는데 서버를 실행하고 나니 'user_tb'을 찾을 수 없다는 에러가 발생했다. 뭔가 이상해서 ddl-auto를 create로 지

bbogle2.tistory.com

 

728x90
반응형
728x90
반응형

springboot와 jpa를 활용한 프로젝트를 생성 중인데 데이터 입력일자와 수정일자가 자동으로 입력될 수 있도록 모든 dto가 이러한 기능을  상속받게 만들고 싶었습니다.

근데 인터넷 예제들 중 어떤 것들은 abstract로, 어떤 예제들은 class로 만들었기 때문에 차이에 대해서 물어보았습니다.

 

대답은 아래와 같았습니다. 

 

입력일자와 수정일자를 자동으로 셋팅해주는 기능을 모든 DTO가 상속받을 수 있도록 구현하려면 보통 추상 클래스나 클래스의 메서드로

구현합니다. 추상 클래스와 클래스의 메서드를 사용하는 것 모두 가능하며, 각각의 방식에는 장단점이 있습니다.

 

 

1. 추상 클래스(Abstract class) 사용:


  • 추상 클래스를 사용하여 공통 필드와 메서드를 정의하고, 이를 상속받아 사용합니다.
  • 장점: 코드 재사용성이 높아집니다. 공통적인 기능을 한 곳에서 관리할 수 있어 유지보수가 편리합니다.
  • 단점: Java는 다중 상속을 지원하지 않으므로, 이미 다른 클래스를 상속받은 경우 추상 클래스를 상속받을 수 없습니다.

 

2. 클래스의 메서드 사용:


  • 클래스 내에 공통적으로 필요한 메서드를 정의하여 사용합니다. 필요한 클래스에 메서드를 호출하여 사용합니다.
  • 장점: 클래스의 메서드를 사용하기 때문에 다중 상속이 필요하지 않습니다. 필요한 클래스에 직접 메서드를 호출하여 사용할 수 있습니다.
  • 단점: 각각의 클래스에 메서드를 호출해야 하므로, 코드 중복이 발생할 수 있습니다.

 

 

즉! 어떤 방법을 선택할지는 프로젝트의 구조와 요구 사항에 따라 달라집니다. 보통은 추상 클래스를 사용하여 공통적인 기능을 구현하고, 필요한 경우 클래스의 메서드를 사용하여 추가적인 기능을 구현한다고 합니다.

728x90
반응형
728x90
반응형

 

안녕하세요!

저에게는 jdk11과 jdk17이 모두 필요한 슬픈 사연이 생겼습니다...

하지만 한 대의 컴퓨터에게 자동으로 내가 필요한 자바 버전을 찾아라! 하는 것은 불가능한가봅니다...훌쩍

 

매번 openjdk를 지웠다 까는 행태를 반복하다가 이건 아니다 싶어서 구글링 시작!

역시나 손쉽게 자바 버전을 변경하는 방법이 있었습니다~

 

제가 참고한 글을 첨부 드리니 참고 바랍니다! 

 

[MacOS] JDK 설치, 환경변수 설정하기(+ jdk 버전 변경)

Overview iTerm과 zsh 설치 (처음으로 macOS 접하신 분들 한해서) homebrew 설치 기본적인 JDK 설치 및 링크 설정하기 JDK 버전 수동으로 변경하기 JDK 버전 간편하게 변경하기 📌 1. Overview 윈도우 운영체제

beaniejoy.tistory.com

 

자자 이제 본격적으로 블로그를 따라서 시작해보겠습니다.

 

터미널에서 아래 명령어 입력! unix 서버에서는 .profile을 사용했었는데, 맥이니까 새로운 마음으로 .zshrc를 사용해보겠습니다.

vim ~/.zshrc

 

i 입력해서 INSERT모드로 바뀌면 아래 내용을 작성한 뒤 esc키를 누르고 wq!입력 후 엔터!

jdk() {
      version=$1
      unset JAVA_HOME;
      export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
      unset PATH;
      export PATH=$JAVA_HOME/bin:$PATH;
      java -version
}

 

변경 내용을 적용하기 위해서 터미널에서 아래 명령어를 입력해주세요!

source ~/.zshrc

 

자 그럼 터미널에서 테스트해볼까요?

# idk 11로 변경하기
jdk 11

# idk 17로 변경하기
jdk 17

 

짜잔!

1초만에 자바 버전 바꾸기 성공했습니다~

728x90
반응형
728x90
반응형

 

 

EC2의 세부정보에 들어가보면 [퍼블릭 IPv4 주소]에 탄력적 IP의 [프라이빗 IP 주소]가 할당된 것을 볼 수 있다!

 

  • 참고 사이트 : 
 

Github Action을 활용한 배포 자동화 CI/CD - (1) EC2 생성하기

해커톤에서 구축했던 서버 환경을 다시 한번 세팅해보기 시리즈 1탄 : ec2 인스턴스 생성하기

velog.io

 

728x90
반응형
728x90
반응형

 

 

  •  
  •  
  • 참고한 사이트 : 
 

Github Action을 활용한 배포 자동화 CI/CD - (1) EC2 생성하기

해커톤에서 구축했던 서버 환경을 다시 한번 세팅해보기 시리즈 1탄 : ec2 인스턴스 생성하기

velog.io

 

728x90
반응형

+ Recent posts