no image
AWS 서버 한국 시간으로 변경하는 것을 까먹지 말자
개요 AWS EC2와 AWS RDS 서버에서 서버 시간이 한국 시간이 아니어서 게시글을 작성하는데 우리가 원하는 한국 시간이 아닌 UTC로 나와 문제가 생겨 해결해본 경험을 공유해보고자합니다. AWS EC2 서버 시간 변경하기 AWS EC2 서버 시간을 변경하는 것은 우분투 시간 변경 명령어를 사용하기만 하면되어서 간단했습니다. sudo timedatectl set-timezone Asia/Seoul AWS RDS 서버 시간 변경하기 AWS RDS 서버 시간 변경하는 것은 과정이 조금 복잡했습니다. 아래의 과정을 따라주시면 됩니다. 먼저 AWS 웹페이지에서 RDS 메뉴로 이동해 [파라미터 그룹]을 선택합니다. [파라미터 그룹] 선택 후 나온 파라미터 그룹 화면에서 [파라미터 그룹 생성]을 클릭합니다. (..
2023.07.28
no image
Lombok @Builder 사용 시 기본값을 지정해줘야한다면 @Builder.Default를 사용하자
개요 프로젝트 중 엔티티 클래스에 대해 Builder 패턴을 적용하는 경우가 있었는데 이 때, 기본값으로 반드시 지정되어야하는 경우가 있었습니다. 제 경우를 예시로 들자면 게시글을 생성하면 게시글 상태가 기본적으로 "게시글 등록" 상태로 설정해주어야하는 상황이었습니다. 이런 상황을 해결할 수 있는 방법에 대해 공유하고자 합니다. @Builder.Default를 사용하자 @Builder.Default를 사용해서 해당 경우를 해결 할 수 있습니다. 제가 사용한 코드를 예시로 보시죠. 코드에서 볼 수 있듯이 게시글 상태를 지정하는 변수인 boardStatus에 @Builder.Default 애노테이션이 붙은 것을 보실 수 있습니다. 이 상태에서 BoardStatus.BOARD_POST(게시글 등록 상태)를 지..
2023.07.28
gradlew test -i 를 사용해 테스트코드 오류를 찾자
빌드 때 테스트코드에 오류 생긴 부분을 못찾고 있었는데 gradlew test -i로 모든 로그를 띄우게 하니 에러의 원인을 찾을 수 있었습니다. 혹시 테스트코드 오류가 났는데 현재있는 로그로만 해결법을 못찾겠다면 해당 명령어를 사용해보면 좋을 것 같습니다. 참고블로그 https://ayasetaka.tistory.com/30
2023.07.28
no image
스프링에서 같은 엔드포인트에 쿼리 파라미터가 다른 컨트롤러 메서드 구성하기
개요 프로젝트 중에 게시글 목록을 반환하는 API를 만드는 중 3개의 쿼리 파라미터에 따라 전달하는 데이터가 다른 경우가 발생했습니다. 3개의 쿼리 파라미터는 페이지 정보, 정렬 기준, 카테고리 였는데요. 이 3가지를 모두 선택하는 경우, 이 중 2가지만 선택하는 경우, 이중 하나만 선택하는 경우 혹은 하나도 선택하지 않은 경우 모두를 컨트롤러 메서드로 만들기에는 비효율적이라 생각했습니다. 이런 경우 한 가지 메서드로 모든 것을 처리할 수 있는 방법에 대해 소개해드리려고 합니다. @RequestParam을 사용하자 @RequestParam을 사용하여 세 가지 쿼리 파라미터를 모두 한 메서드 내에서 정의가 가능합니다. 아래 예시를 보시죠. 페이지 정보, 정렬 기준, 카테고리 쿼리 파라미터가 모두 한 컨트롤..
2023.07.28
no image
Null 값에 비교연산자를 사용해야한다면 == 을 사용해야한다.
개요 프로젝트 진행 중 null 값에 비교연산자를 사용하여 null인 경우와 아닌 경우를 구분해서 작업을 진행해야하는 순간이 있었습니다. 아무 생각 없이 null 값은 객체가 값을 참조하지 않은 경우니까 객체의 값을 비교하는 .equals()를 써야겠지라고 생각했다가 문제가 생겨 부끄러운 순간이지만 내용을 공유해보려고합니다. ==을 사용해야하는 이유 null은 힙 영역의 객체를 참조하지 않는다는 뜻으로 존재하는 특수한 상태 타입입니다. null로 초기화된 참조 변수는 스택영역에 생성되죠. 그렇기 때문에 .equals()가 아닌 ==을 사용해야합니다. 결론 그런데 생각해보니 null을 처리하기 위한 Optional이라는 좋은 선택지가 있었는데 왜 생각하지 못했는지...
2023.07.27
no image
LocalDateTime 시간 출력 형식에 따라 변환하기
개요 프로젝트에서 커뮤니티 글의 작성 시간을 LocalDateTime 타입으로 저장하도록 되어 있었는데요. 게시글을 들어갔을 때 작성 시간을 알려주기 위해 LocalDateTime을 그대로 사용하면 년-월-일-시간-분(ms까지) 나오기 때문에 저희가 원하는 형태인 년.월.일 형태로 변경해서 응답을 보내주어야했습니다. DateTimeFormatter.ofPattern 사용하기 개요 LocalDateTime 타입에는 format 이라는 함수를 사용할 수 있습니다. DateTimeFormatter 타입의 값을 인자로 넣어 원하는 날짜 형식으로 변환하는 함수입니다. 이 때, DateTimeFormatter 타입의 ofPattern 함수를 사용하여 String으로 원하는 날짜 형식을 정할 수 있습니다. 원하는 날..
2023.07.27

목차

    개요

    AWS EC2와 AWS RDS 서버에서 서버 시간이 한국 시간이 아니어서 게시글을 작성하는데 우리가 원하는 한국 시간이 아닌 UTC로 나와 문제가 생겨 해결해본 경험을 공유해보고자합니다.

     

    AWS EC2 서버 시간 변경하기

    AWS EC2 서버 시간을 변경하는 것은 우분투 시간 변경 명령어를 사용하기만 하면되어서 간단했습니다.

    sudo timedatectl set-timezone Asia/Seoul

     

    AWS RDS 서버 시간 변경하기

    AWS RDS 서버 시간 변경하는 것은 과정이 조금 복잡했습니다.

    아래의 과정을 따라주시면 됩니다.

     

    먼저 AWS 웹페이지에서 RDS 메뉴로 이동해 [파라미터 그룹]을 선택합니다.

     

     

    [파라미터 그룹] 선택 후 나온 파라미터 그룹 화면에서 [파라미터 그룹 생성]을 클릭합니다.

    (myparametergroup은 제가 미리 생성해둔 파라미터 그룹입니다.)

     

     

    [파라미터 그룹 생성] 클릭 후 나온 화면에서 우선 [파라미터 그룹 패밀리]를 선택합니다.

    저 같은 경우에는 mysql8.0을 사용하고 있어서 mysql8.0을 선택했습니다.

     

     

    이후 원하시는 그룹 이름과 설명으로 파라미터 그룹 생성을 해줍니다.

     

     

    [생성] 버튼을 누르시면 맨처음 보셨던 화면과 같이 그룹이 생성되었음을 확인하실 수 있습니다.

    생성한 파라미터 그룹을 클릭해 수정하면 됩니다.

     

     

    생성하신 그룹에 들어가신 후 [편집] 버튼을 클릭해줍니다.

     

     

    [편집] 버튼을 클릭하여 나타난 화면에서 time_zone을 검색하시고 값을 Asia/Seoul을 작성해주신 후 [Save Changes] 버튼을 클릭해주시면 됩니다.

     

    변경이 완료되셨으면 시간 변경을 원하는 RDS 인스턴스를 수정해주어야합니다.

    수정을 원하시는 RDS 인스턴스에 들어가신 후 [수정] 버튼을 클릭합니다.

    [수정] 버튼을 클릭한 후 나타난 화면에서 하단에 있는 [추가 구성] 탭 까지 이동하면 DB 파라미터 그룹을 선택하실 수 있습니다.

    여기서 앞서 생성하신 파라미터 그룹을 등록하시면 됩니다.

     

     

    마지막으로 해당 RDS 인스턴스를 재부팅 해주면 모두 완료됩니다.

     

     

    참고 블로그

    https://programforlife.tistory.com/52

     

     

    목차

      개요

      프로젝트 중 엔티티 클래스에 대해 Builder 패턴을 적용하는 경우가 있었는데 이 때, 기본값으로 반드시 지정되어야하는 경우가 있었습니다. 제 경우를 예시로 들자면 게시글을 생성하면 게시글 상태가 기본적으로 "게시글 등록" 상태로 설정해주어야하는 상황이었습니다. 이런 상황을 해결할 수 있는 방법에 대해 공유하고자 합니다.

       

      @Builder.Default를 사용하자

      @Builder.Default를 사용해서 해당 경우를 해결 할 수 있습니다.

      제가 사용한 코드를 예시로 보시죠.

       

      코드에서 볼 수 있듯이 게시글 상태를 지정하는 변수인 boardStatus에 @Builder.Default 애노테이션이 붙은 것을 보실 수 있습니다. 이 상태에서 BoardStatus.BOARD_POST(게시글 등록 상태)를 지정해주면 게시글 엔티티는 빌더로 생성할 때 boardStatus를 지정하지 않아도 게시글 등록 상태가 기본적으로 적용됩니다.

       

       

      참고 블로그

      https://projectlombok.org/features/Builder

      목차

        빌드 때 테스트코드에 오류 생긴 부분을 못찾고 있었는데 gradlew test -i로 모든 로그를 띄우게 하니 에러의 원인을 찾을 수 있었습니다.

         

        혹시 테스트코드 오류가 났는데 현재있는 로그로만 해결법을 못찾겠다면 해당 명령어를 사용해보면 좋을 것 같습니다.

         

         

        참고블로그

        https://ayasetaka.tistory.com/30

        목차

          개요

          프로젝트 중에 게시글 목록을 반환하는 API를 만드는 중 3개의 쿼리 파라미터에 따라 전달하는 데이터가 다른 경우가 발생했습니다. 3개의 쿼리 파라미터는 페이지 정보, 정렬 기준, 카테고리 였는데요. 이 3가지를 모두 선택하는 경우, 이 중 2가지만 선택하는 경우, 이중 하나만 선택하는 경우 혹은 하나도 선택하지 않은 경우 모두를 컨트롤러 메서드로 만들기에는 비효율적이라 생각했습니다. 이런 경우 한 가지 메서드로 모든 것을 처리할 수 있는 방법에 대해 소개해드리려고 합니다.

           

          @RequestParam을 사용하자

          @RequestParam을 사용하여 세 가지 쿼리 파라미터를 모두 한 메서드 내에서 정의가 가능합니다.

          아래 예시를 보시죠.

           

          페이지 정보, 정렬 기준, 카테고리 쿼리 파라미터가 모두 한 컨트롤러 메서드의 인자로 들어가있는 것을 보실 수 있습니다.

          @RequestParam의 속성 required에 false 값을 주면 필수값이 아니므로 해당 파라미터는 값이 없어도 됩니다. 다만 제 상황과 같이 값이 주어지지 않을 때에도 기본적으로 적용되어야하는 값들이 있을 수 있습니다.

          위 상황에서는 page 파라미터가 쿼리 파라미터에 없어도 1페이지에 대한 값인 것을 나타낼 수 있어야한다는 점입니다.

          그런 상황에서는 @RequestParam 속성 defaultValue에 값을 지정해주시면 됩니다.

           

           

          참고 블로그

          https://bum752.github.io/posts/%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C-%EA%B0%99%EC%9D%80-%EC%97%94%EB%93%9C%ED%8F%AC%EC%9D%B8%ED%8A%B8%EC%97%90-%EC%BF%BC%EB%A6%AC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EA%B0%80-%EB%8B%A4%EB%A5%B8-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-%EB%A9%94%EC%86%8C%EB%93%9C-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0/

          목차

            개요

            프로젝트 진행 중 null 값에 비교연산자를 사용하여 null인 경우와 아닌 경우를 구분해서 작업을 진행해야하는 순간이 있었습니다. 아무 생각 없이 null 값은 객체가 값을 참조하지 않은 경우니까 객체의 값을 비교하는 .equals()를 써야겠지라고 생각했다가 문제가 생겨 부끄러운 순간이지만 내용을 공유해보려고합니다.

             

            ==을 사용해야하는 이유

            null은 힙 영역의 객체를 참조하지 않는다는 뜻으로 존재하는 특수한 상태 타입입니다.

            null로 초기화된 참조 변수는 스택영역에 생성되죠.

             

            그렇기 때문에 .equals()가 아닌 ==을 사용해야합니다.

             

            결론

            그런데 생각해보니 null을 처리하기 위한 Optional이라는 좋은 선택지가 있었는데 왜 생각하지 못했는지...

             

            목차

              개요

              프로젝트에서 커뮤니티 글의 작성 시간을 LocalDateTime 타입으로 저장하도록 되어 있었는데요. 게시글을 들어갔을 때 작성 시간을 알려주기 위해 LocalDateTime을 그대로 사용하면 년-월-일-시간-분(ms까지) 나오기 때문에 저희가 원하는 형태인 년.월.일 형태로 변경해서 응답을 보내주어야했습니다.

               

              DateTimeFormatter.ofPattern 사용하기

              개요

              LocalDateTime 타입에는 format 이라는 함수를 사용할 수 있습니다.

              DateTimeFormatter 타입의 값을 인자로 넣어 원하는 날짜 형식으로 변환하는 함수입니다.

               

              https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

               

              이 때, DateTimeFormatter 타입의 ofPattern 함수를 사용하여 String으로 원하는 날짜 형식을 정할 수 있습니다. 원하는 날짜 형식은 주어진 Symbol을 따라 작성하면 됩니다.

              아래는 Symbol의 일부입니다. 사진의 출처사이트에 방문하시면 더 많은 Symbol을 확인하실 수 있습니다.

               

              https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

               

              https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

               

              예시

              우선 제게 주어진 요구사항과 같이 년.월.일 형태로 변경해보는 예시를 보겠습니다.

              LocalDateTime dateTime = LocalDateTime.now()를 통해 현재 시간을 저장하고 해당 타입을 년.월.일 형태로 변경하는 코드 입니다.

               

              이를 통해 출력된 결과는 아래와 같습니다.

               

              이번에는 다양한 타입의 형태를 출력하도록 해보겠습니다.

              연도를 나타내는 y Symbol의 개수를 조절해서도 서로 다른 형태로 나타낼 수 있고 월을 나타내는 M Symbol의 개수를 조절해서도 서로 다른 형태를 나타낼 수 있습니다.

              다양한 조합을 Documentation 내용을 참고해서 변경해보셔도 좋을 것 같습니다.

               

              다양한 Symbol 조합으로 만든 예시
              그 결과