분류 전체보기
-
[Spring] Test에서 public이 아닌 필드 Reflection 으로 값 넣어주는 법Server/Spring 2021. 11. 26. 21:21
Test에서 public이 아닌 필드를 Reflection 으로 값 넣어주는 법 이번 글에서는 테스트 코드를 작성하면서 public이 아닌 필드에 값을 넣어주어야 하는 상황에서 Reflection을 사용해서 값을 넣어주는 법에 대해서 정리해보겠습니다. 이번 글은 Reflection이 무엇인지 설명하는 글은 아니다 보니 Reflection을 알고 싶다면 Reflection 알아보기 를 참고하시면 좋을 거 같습니다. 먼저 제가 진행하고 있는 프로젝트에서 겪은 상황에 대해서 공유해보겠습니다. 현재 Repository는 Mockito를 사용해서 Mocking 하고 Service Layer의 메소드만 Unit Test를 해보려 하고 있습니다. 내부 로직이 없고 단순히 Entity -> DTO로 변환하는 메소드 입..
-
[JPA] Fetch Join 할 때 MultipleBagFetchException 해결하는 법Server/JPA 2021. 11. 24. 14:53
Spring Data JPA에서 MultiBagFetchException 해결하기 이번 글에서는 JPA를 사용한지 얼마 안된 초보자 입장에서 겪은 어려움을 공유하고 어떻게 해결해나갔는지 공유하며 생각을 정리해보려 합니다. 위의 화면에 대한 API를 만들어야 하는 상황입니다. 위의 뷰에서는 내가 팔로우 하고 있는 사람이 작성한 게시글이 나타나야 합니다. View를 보면서 DB Table을 간단하게 같이 보겠습니다. 하나의 게시글 : 여러 장의 사진 (1 : N) 하나의 게시글 : 여러 개의 가게 평가 해시 태그 (1 : N) 하나의 게시글 : 같이 가게를 간 사람들의 닉네임 (1 : N) 위의 조건에 해당하는 데이터를 다 가져와야 하나의 Post(게시글)을 보여줄 수 있습니다. 즉, JOIN이 꽤 많이 들..
-
[Java] Thread synchronized, Lock 개념 정리하기카테고리 없음 2021. 11. 23. 20:52
Java Thread Lock 개념 정리 Java에서 synchronized 키워드를 사용하는 방법은 크게 3가지로 나눌 수 있습니다. 어쩌면 단순한 내용이지만 하나씩 Lock의 개념을 이해하면서 정리해보겠습니다. synchronized 메소드 public class MusicExam { public static void main(String[] args) { MusicBox box = new MusicBox(); MusicPlayer musicPlayer1 = new MusicPlayer(1, box); MusicPlayer musicPlayer2 = new MusicPlayer(2, box); musicPlayer1.start(); musicPlayer2.start(); } } public class..
-
[Spring] @Builder를 사용할 때 고려해야 할 생성자 문제 알아보기Server/Spring Boot 2021. 11. 21. 00:48
@Builder, @AllArgsConstructor 알아보기 이번 글에서는 @Builder, @AllArgsConstructor, @NoArgsConstructor 애노테이션을 사용할 때 알아야 할 점에 대해서 정리해보겠습니다. 위와 같이 @Builder, @NoArgsConstructor를 사용했을 때 Lombok에서 만들어주는 메소드를 알아보겠습니다. 만들어주는 메소드를 보면 기본 생성자, 빌더 관련 메소드들을 만들어주는 것을 볼 수 있습니다. Builder가 어떤 것인지 안다면 전체 생성자가 필요하다는 것을 알 수 있습니다. (Builder가 궁금하다면 여기 에서 확인하실 수 있습니다.) Builder란 생성자의 매개변수가 많을 때 좀 더 편리하게 객체를 만들 수 있게 도와주는 것이고, Build..
-
[Spring] 프로젝트에서 MyBatis ResultMap을 사용하게된 이유Server/Spring 2021. 11. 18. 22:05
MyBatis ResultMap 사용하게 된 이유 이번 글에서는 프로젝트에서 MyBatis를 사용하면서 ResultMap을 사용한 것에 대해서 정리해보겠습니다.(ResultMap이 어떤 것인지?를 정리한 것이라기 보다 프로젝트에서 왜 ResultMap을 썼고 어떻게 적용했는지 정도만 정리해두려 작성하는 글입니다!) MyBatis 사용하는 법이 궁금하다면 여기 에서 확인할 수 있습니다. 제가 프로젝트에서 사용하고 있는 Layer를 간단하게 그리면 위와 같습니다. 즉, 클라이언트에게 받아온 DTO를 Service Layer에서 DTO -> Entity 과정을 거친 후에 DB Layer에 영속화 시키는 작업을 하고 있습니다. 그리고 DB Layer에서 조회한 결과들도 Service Layer에서 Entity ..
-
[Spring] Spring Data JPA에서 Auditing 사용하는 법Server/JPA 2021. 11. 9. 12:05
JPA AuditingEntityListener 알아보기 위의 코드는 제가 작성했던 코드인데요. 누군가 저에게 아래와 같이 물었습니다. LocalDateTime.now() 코드는 왜 작성한거야? 위의 질문을 듣고 아.. BaseEntity를 통해서 생성시간, 수정시간을 저장하기 위해서 만들었는데 now() 코드는 없어도 되려나? 라는 생각이 들었습니다. 지금 생각하면 당연히 없어도 될 코드인데 왜 저렇게 작성했나 싶지만.. 어쨋든 AuditingEntityListener가 어떻게 동작하는지 잘 모르고 사용하고 있는 거 같아서 이번 글에서는 JPA AuditingEntityListener를 어떻게 사용하고 어떤 원리로 동작하는 것인지 알아보겠습니다. JPA Auditing 이란? 언제 만들어졌는지, 언제 ..
-
[Spring] Spring Data JPA에서 Paging 간단하게 구현하는 법Server/JPA 2021. 11. 8. 20:44
Spring Data JPA에서 페이징 구현하는 법 이번 글에서는 Spring Data JPA에서 Paging을 구현하는 법에 대해서 알아보겠습니다. 저는 JPA에 대해서 이제 공부하는 단계라 페이징을 처음 구현해보는데요. 공부하기 전에도 JPA로 페이징을 구현하는게 어렵다 라는 말은 많이 듣기만 해봤는데 이번 기회에 한번 공부해보면서 정리를 해보겠습니다. (이번 글의 코드를 보고 싶다면 Github 에서 확인하실 수 있습니다.) 페이징은 위의 보이는 것처럼 한 화면에 다 보여줄 수 없기 때문에, 페이지를 나눠서 게시글을 보여주는 것을 말하는데요. 페이징을 구현하는 방법, 성능을 개선하는 방법 등등 정말 다양하고 복잡하지만 초급자의 마음으로 정리해보겠습니다. 이번 글에서 사용할 기술 Java 11 Spr..
-
[Spring] Primitive boolean Type is Remove Jackson 직렬화 문제 해결하기Server/Spring 2021. 11. 7. 17:25
Primitive boolean Type에서 isXX에서 is가 사라지는 Jackson 직렬화 문제 해결하기 이번 글에서는 Spring Boot에서 DTO를 클라이언트에 JSON 으로 Response 할 때 isXXX 네이밍에서 is가 사라지는 문제를 해결하는 아주 간단한 과정을 공유해보려 합니다. 프로젝트를 진행하면서 위와 같은 DTO를 클라이언트에게 반환하고 있었습니다. 보면 Primitive Type boolean의 isFailedGroupQuiz 라는 필드가 존재하는 것도 볼 수 있습니다. 그래서 이제 해당 DTO가 사용되는 API를 Postman으로 호출해보겠습니다. 응답 값을 보면 DTO에 분명 isFailedGroupQuiz 라고 적었지만, FailedGroupQuiz라고 오는 것을 볼 수 ..