본문 바로가기
  • 개발하는 곰돌이

Development48

[JPA] Service 계층에서 DataIntegrityViolationException을 처리하기 목차 문제의 배경 JPA 예제를 작성하면서 회원 등록 기능을 구현할 때 전화번호를 유일한 값으로 지정하고 싶었다. 그래서 DB 상에서 전화번호를 유일키로 지정하고 이미 등록된 전화번호를 등록하려고 하면 IllegalArgumentException을 발생시켜서 요청값이 잘못되었다는 것을 알려주려고 했다. 이를 위해 무결성 제약조건을 위배하면 발생하는 DataIntegrityViolationException을 try-catch로 잡아내서 새로운 IllegalArgumentException를 발생시키려고 했는데 try-catch에서 DataIntegrityViolationException을 잡아내지 못하는 상황이었다. 문제 상황의 코드 MemberService.kt @Service class MemberSer.. 2023. 4. 25.
[Spring Boot] 스프링부트 실행 시 나타나는 배너를 바꿔보자 목차 시작하기 전에 스프링부트로 애플리케이션을 개발하는 개발자라면 굉장히 익숙할 스프링 배너. 하지만 너무 자주 보는 배너라 그런지 가끔씩 질린다는 느낌이 들 때가 있다. 이런 경우에 새로운 기분을 느끼기 위해 콘솔에 찍히는 배너를 마음껏 커스텀해보자. 스프링부트 배너 교체 스프링부트는 기본적으로 프로젝트 경로 내부의 resources/banner.txt 파일에 작성된 내용을 출력하고, 해당 파일이 없을 경우에는 위의 아주 익숙한 스프링 배너를 출력한다. banner.txt를 만들고 아무 내용도 입력하지 않으면 이렇게 아예 배너가 나오지 않고 ============ 스프링부트 배너! ============ 내용을 입력하면 이렇게 입력한 내용이 출력되는 것을 볼 수 있다. 하지만 단순 텍스트만 출력되니까 .. 2023. 4. 14.
[WebClient] WebClient를 사용하여 외부API 호출 후 처리할 비즈니스 로직을 비동기로 처리해보기 목차 문제의 상황 프로젝트를 진행하다 보면 여러 개의 외부 API를 호출하고 그 응답을 토대로 어떤 동작을 수행하는 경우가 있다. 일반적으로 많이 사용하던 RestTemplate의 경우에는 스프링 5.0부터 사소한 변경이나 버그 수정만 반영된다고 하길래 사실상 deprecated된게 아닌가 생각한다. 마침 스프링 5.0에 새로 추가된 WebClient가 비동기 방식도 지원한다고 하여 RestTemplate 대신 사용하고 있었다. WebClient를 사용하여 외부 API를 비동기 방식으로 호출하는 예제는 찾기 쉬웠지만 정작 외부 API의 응답을 토대로 추가적인 로직을 수행하는 예제는 사실상 없다시피 했다. 그래서 비동기 방식을 지원한다는 WebClient의 특성이 무색하게 CompletableFuture를.. 2023. 4. 12.
[Kotlin + Spring Boot] 코틀린 + 스프링부트에서 Slf4j를 사용하여 로그 찍기 목차 서론 자바 + 스프링부트를 사용할 때는 대부분 Lombok을 사용하여 각종 어노테이션으로 객체나 메소드들을 생성하게 된다. Slf4j의 Logger 객체 역시 클래스 위에 Lombok의 @Slf4j를 붙여주는 것으로 편하게 생성할 수 있다. 그러나 코틀린에서는 아직 Lombok을 제대로 지원하지 않는다. 따라서 @Slf4j 어노테이션을 사용하여 Logger 객체를 생성하는 방법 역시 사용할 수 없다. 그렇다면 직접 Logger 객체를 생성해야 하는데 코틀린 + 스프링부트에서 Slf4j의 Logger 객체를 생성하는 방법이 여러 가지 있어서 한 번 정리해보려고 한다. Logger 객체 생성방법 기본 Slf4j의 Logger 객체를 생성하는 가장 기본적인 방법은 아래와 같이 클래스 내부에서 Logger.. 2023. 4. 6.
[Kotlin/JPA] 코틀린과 JPA를 함께 사용할 때 추가적으로 설정해야 하는 것들과 Data class 목차 개요 JPA는 자바 진영에서 DB와 연동하기 위해 사용하는 기술 중 하나이다. 자바와 100% 호환되는 코틀린의 특성상 JPA 역시 사용할 수 있긴 하지만 기본적으로 자바에 맞춰진 기술이다 보니 코틀린과 JPA를 함께 사용할 때 문제없이 사용하기 위해선 추가적으로 설정해야 할 것들이 있다는 것을 알게 되었다. 이 글에서는 코틀린과 JPA를 함께 사용할 때 추가적으로 설정해야 하는 것들과 그 외의 주의사항에 대해 정리한다. JPA의 구현체는 가장 많이 사용되는 하이버네이트를 따른다. JPA의 Entity가 갖는 요구사항 우선 왜 이러한 설정을 사용해야 하는지, 또 왜 이런 사항을 주의해야 하는지를 이해하기 위해선 JPA의 엔티티가 갖는 요구사항을 알 필요가 있었다. 하이버네이트 사용자 가이드에서 이야.. 2023. 3. 29.
[JPA] 양방향 연관 관계에서 연관 관계의 주인 설정과 주의 사항 목차 개요 JPA에서는 두 엔티티 사이의 연관 관계를 정의할 때 기본적으로 단방향으로 정의한다. 이로 인해 DB 테이블에서 외래키를 기준으로 하여 조인하는 것으로 두 테이블 간의 연관된 데이터를 조회할 수 있는 것과 달리 JPA에서 단방향 연관 관계가 정의된 상태에서는 한 쪽 엔티티 객체는 연관 관계인 엔티티 객체를 조회할 수 있으나, 반대쪽 엔티티 객체는 어떤 엔티티 객체와 연관 관계를 갖는지 알 수 없다. 이로 인해 JPA에서는 필요에 따라 양방향 연관 관계를 정의하게 되는데, 이 과정에서 주의해야할 중요한 점이 있어서 어느정도 정리해보려고 한다. JPA의 양방향 연관 관계 앞서 이야기한 바와 같이 필요에 따라선 연관된 두 엔티티 사이에서 서로 연관된 엔티티 객체를 조회해야 할 수 있다. 예를 들면 .. 2023. 3. 22.
[Spring] 유틸성 메소드를 작성할 때 Spring Bean과 정적 메소드를 모아놓은 클래스 중 무엇을 사용해야 할까? 목차 개요 프로젝트를 진행하다 보면 다양한 유틸성 메소드를 작성해서 사용하는 경우가 많다. 개인적으로는 이렇게 유틸성 메소드가 필요한 경우에는 Java라면 별도의 클래스에 유틸성 메소드를 static 메소드로 작성하고 Kotlin이라면 별도의 파일에 Top-Level 메소드로 작성해서 사용하고 있었다. 그러다가 단순히 계산만 하는 유틸성 메소드가 작성된 클래스를 스프링 빈으로 등록하여 사용하고 있는 코드를 보면서 스프링 빈으로 등록해도 싱글톤으로 동작하는데 이 방법도 틀린건 아니지 않나?라는 생각이 들어 구글링을 해봤는데 비슷한 생각을 했던 분들이 계셔서 한 번 정리해보려고 한다. 이하 유틸성 클래스라고 언급하는 것은 정적 메소드만을 모아놓은 별도의 클래스를 지칭한다. Spring Bean과 유틸성 클래.. 2023. 3. 15.
[JPA] hibernate의 ddl-auto 속성의 종류와 주의해야할 점 목차 개요 JPA의 구현체 중 하나인 하이버네이트는 다양한 기능을 제공하는데 그 중 엔티티만 등록해놓으면 DDL(Data Definition Language)을 자동으로 작성하여 테이블을 생성하거나 수정해주는 ddl-auto라는 설정이 있다. JPA에 대해 아는 것이 거의 없던 처음에는 DDL을 자동으로 작성해주는 아주 편리한 기능이라고만 생각했는데, JPA를 배워가면서 마냥 편리한 기능이 아니라 잘못 다루면 돌이킬 수 없는 결과를 가져오는 아주 위험한(?) 기능이라는 것을 느끼게 되었다. 이 포스트에서는 JPA 하이버네이트에서 제공하는 ddl-auto의 종류와 기능, 그리고 주의 사항에 대해서 정리하려고 한다. ddl-auto 속성의 종류 ddl-auto에는 아래와 같이 5가지 종류의 속성이 있다. c.. 2023. 3. 14.