본문 바로가기

728x90

Spring

(11)
[JPA] 양방향 매핑 관계 로딩 방법 별로 살펴보기 (N+1 문제는 도대체 언제?) 개인적으로 너무 헷갈리고, 진심인데 블로그 포스트마다 내용이 다른 것 같기도 하다. 그냥 직접 하면서 최대한 가능한 상황들을 정리해보려고 한다. 더 헷갈리게만 만드는 장황한 설명따윈 없이, 그냥 내가 정리하고 싶기도 해서 특정 CASE 에 대한 결과만 정리하니, 참고하실 분들은 결과만 참고하시면 좋을 것 같다. 기본적으로 다음과 같이 클래스들이 있다. 이하로 정리되는 내용은 의 제목으로 정리된다. @Entity @Getter @NoArgsConstructor @Table(name = "groups") public class Group { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "group", fetch..
[Spring MVC] org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 오류 API 테스트를 하다가 이해가 안되는 상황이 발생했는데, 이런 상황이 발생할 수도 있구나 싶고 누군가에게 도움이 될 수도 있을 것 같아서 짧게 기록해둔다. 다음과 같은 페이징 조회를 하여 특정 테이블에서 추천 인스턴스들을 반환하는 요청을 만든 후 API 테스트를 하던 중 발생하였다. @GetMapping("/api/v0/hello/suggest") public ResponseEntity getHello( @RequestParam(required = false, defaultValue = "") String aFilter , @RequestParam(required = false, defaultValue = "") String bFilter , @RequestParam(defaultValue = "-1")..
[JPA] 연관 객체 불러오기.. Fetch Join 정말 괜찮을까? 결론부터 말하자면 약간 뻘짓한 글이다. 그래도 긍정적으로 본다면 고민을 해봤다는 의의는 있으니.. 초보자의 수준에서 한 번 고민을 공유한다고 생각하면 될 것 같다. (1) 개요 서비스단을 개발하다 고민하게 된 부분이 있어서, 정리해보면서 결론을 만들어 나가보기로 했다. 우선 개요는 다음과 같다. Group 객체가 있고, Group 활동 안에 게시물인 Post 객체가 있으며, Post 에는 댓글인 Comment 객체가 있는 다음과 같은 상황이다. 아래에는 표시되어 있지 않지만, Member 객체가 당연히 있으며, Member 와 Group 사이에는 현재 상태가 기록되고, [강퇴 / 휴면 / 활동] 의 세 가지 상태로 관리된다. 이와 같은 관계는 많이 발생하는 일반적인 상황으로, 모두 비식별 관계이다. 이 ..
[단위테스트] Unit Test 를 통해 함수를 Refactoring 해보자 Spring Boot 를 통해 앱을 개발하는 중에 기존 코드들을 단위테스트를 진행하면서 Refactoring 을 할 수 있었는데, 사실 Refactoring 을 하겠다고 생각하면서 굉장히 NAIVE 하게 짰던 기존 코드긴 하지만, Refactoring 에 큰 도움을 준다는 점을 다시 한 번 알게 되어 글을 작성해 보게 되었다. 바로 코드로 들어가보자. 우선 이 코드는 특정 Group 에 Member 가 가입하는 요청을 보내서, Group 에 가입을 시켜주는 흔한 로직이다. 다음과 같이 Controller 에서 Service 단으로 요청이 넘어온 상태부터 시작한다. public GroupMember joinGroup(RequestDto reqDto, Member member){ // 해당 그룹이 있는지 먼..
[문제기록] Lombok @Getter 사용시 boolean 값 처리에 대하여 프로젝트를 하던 중, 다음과 같은 Request DTO 를 만들어야 할 일이 있어서 만들었다. @Getter @Setter @NoArgsConstructor public class ACreateReqDto { private String name; // ... private boolean hasRule; @JsonProperty("rule") private RuleCreateReqDto ruleDto; @Getter @Setter public class RuleCreateReqDto{ private String ruleName; private boolean isAgeRule; } } 이렇게 해서 다음과 같이 요청처리 코딩을 완료해서 다음과 같이 날려보았다. 다 잘 들어오는줄 알았는데, 이상하게도 isAge..
[Spring 기본] Bean 생명주기 콜백 프레임워크를 통한 앱 개발을 하다보면 정말 많이 듣는 단어인 Life Cycle (생명주기) 이 Bean 에도 역시 있습니다. 사실 이 Bean 의 생명주기보다 Spring App 자체의 생명주기 뼈대를 우선적으로 이해하는 것이 중요하지만, 이번 포스트에서는 Bean 의 생명주기에 대해서 살펴보겠습니다. 생명주기를 제어하기 위해서는 앱이 실행되면서 필요한 연결들을 미리 해두고 (이 경우 Bean 등록), 앱이 종료 시점에 모든 연결을 해제하고 메모리를 비워낼 수 있는 작업 을 진행해야 하며, 이를 중점으로 살펴볼 예정입니다. 우선 이번 포스트에서 Bean 생명주기 이해를 도와줄 Network Client 객체부터 살펴봅시다. NetworkClient 는 특 정 서버와 연결을 하고 데이터 통신을 해주는 객..
[Spring 기본] 의존 관계 주입 전략 (DI Strategy) 이전 포스트에서 잠시 언급된 적이 있지만, Spring에서는 App 을 탐색하며 Bean을 등록하는 과정은 크게 두 가지 절차를 거치게 됩니다. (당장 지난 포스트에서 그림들. 1번, 2번, 3번 그림) 1. Bean 생성 2. 의존 관계 주입 (DI) 지금까지는 간단히 생성자를 통해서 DI를 진행하였지만 (제일 일반적인 방법입니다), 생성자를 통한 주입 말고도 DI 에는 크게 4가지 전략이 있습니다 (Autowire Strategy). (1) 생성자 주입 @Component public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; @Autowired public Membe..
[Spring 기본] Spring Container의 Singleton 전략 스프링은 대부분이 웹 앱을 사용됩니다. 저 또한 웹 앱을 만들기 위해서만 사용했고, 그 외의 사용은 본 적도 없네요. 웹 앱의 가장 큰 역할, 가장 중요한 역할은 바로 '서버로서의 대응'입니다. 웹 앱은 보통 다수의 고객들의 요청을 동 시에 처리하게 됩니다. 잘나가는 웹 서비스들은 한 고객만이 앱을 사용하는 동안 수백번씩의 요청이 이루어지기도 합니다. 만약 Spring이 지금까지 우리가 설계한 설정대로 Bean을 생성하고 주입해준다면 어떻게 될까요? N명의 고객들이 요청을 하여 Service 대응이 필요할 때, Service 객체가 그대로 N번 생성이 되게 됩니다. 그리고 객체를 생성하기 위 해 메모리를 할당할 것이고, 그 주소 역시 힙에 저장하는 과정을 반복하게 됩니다. 이렇게 된다면, 심각한 메모리 ..
[Spring 기본] Spring의 객체 지향 IoC, DI, Bean, Container 지난 포스트에서는 Spring의 도움을 받지 않고 순수한 Java 를 통해서 객체 지향을 위한 설계를 해봤습니다. 이번 포스트에서는 [Spring 기본] 포스트들의 목적에 맞게 Spring이 이런 설계를 도와주기 위해 어떤 지원을 해주는지 살펴보겠습니다. 스프링 짱짱맨.. IoC (Inversion Of Control) IoC 란 어떤 지원되는 기능, 기술을 말하는 것이 아니라, 설계적인 측면의 용어라고 생각하시는게 편합니다. Spring 한정으로 사용되는 용어가 아니라, 메소드 혹은 객체의 호출 작업을 개발자 코드에서 결정되는 것이 아닌, 외부에서 프레임워크 따위가 내 코드를 호출해 주는 구조를 말합니다. 이렇게 제어를 하는 권한이 뒤바뀐다고 해서 IoC, 제어의 역전이라고 부릅니다. 지난 포스트에서 ..
[Spring 기본] 앱 기본 설계, Config 클래스 및 주입의 시작 이번 포스트에선 [Spring 기본] 섹션에서 쭉 사용할 도메인 예제들을 알아보고, 지난시간에 살펴보았던 좋은 객체지향의 관점에서 프로그래밍을 해볼 수 있도록 하겠습니다. 지난 포스트에 이어서, [역할과 구현의 분리]가 어떤식으로 이루어지는지를 중점으로 살펴보시면 될 것 같습니다! 필요 비즈니스 로직 생성 1. Domain (1) Member - 이름, 등급 (VIP, Normal) public class Member { private Long id; private String name; private Grade grade; public Member(Long id, String name, Grade grade) { this.id = id; this.name = name; this.grade = grade..