Backend

API 개발 기본 간단 정리
“김영한 강사님의 JPA 활용편 2- API 개발과 성능 최적화"를 듣고 간단하게 정리하기” @RestController는 기존 @Controller와 @ResponseBody가 합쳐진 형태이다. @RequestBody는 JSON으로 들어온 데이터를 받은 객체로 매핑해서 변환해준다. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @Valid는 javax.validation을 검증한다. @Entity public class..

도메인 개발 팁 간단 정리
"김영한 강사님의 JPA 활용편 1을 듣고 필요한 부분 간단하게 정리하기." JPA는 트랜잭션 안에서 이뤄지기 때문에 @Transactional을 선언해준다. 조회 시에는 @Transactional(readOnly = true)를 설정해주는 것이 조회 성능에 있어서 장점을 가진다. 따라서, 클래스 레벨에서 @Transaction(readOnly = true)로 설정해주고 C, U, D 부분에서 @Transactional을 사용해 메서드 레벨에서 관리한다. 메서드 레벨의 애노테이션이 클래스 레벨의 애노테이션보다 우선순위가 높다. @Transactional(readOnly = true) // 조회 성능에서 장점을 가진다. @Service public class Service { ... @Transaction..

엔티티 설계의 주의사항 간단 정리
"김영한 강사님의 JPA 활용편 1을 듣고 필요한 부분 간단하게 정리하기" 엔티티에는 Setter를 사용하지 않는 것이 좋다. 모든 연관관계는 지연로딩으로 설정한다. 즉시로딩은 회원이랑 주문이 연관관계 있는 경우 회원을 조회하면 주문도 한번에 조회가 되는것을 말함 예측이 어렵고 어떤 SQL이 실행될지 모를 수 있다. 지연 로딩 (LAZY)로 설정하고 Fetch Join을 이용해 데이터를 가져온다. JPQL을 실행할 때 N(연관된 회원 조회 100번) + 1 (주문 쿼리 한번) 문제의 발생 XtoOne관계는 모드 EAGER가 default로 되어있다 → 반드시 LAZY 설정 컬렉션 필드는 초기화를 한다. List orders = new ArrayList(); NPE에 대해 안전해진다. 하이버네이트가 엔티티..

RestTemplate
API를 개발하다보면 외부 API 서비스 혹은 다른 서비스 API를 호출해서 데이터를 송,수신 해야하는 경우가 있다. RestTemplate는 Spring 3부터 지원하기 시작한 “동기 방식"의 REST API 호출 방법이다. Http 요청을 작성할 수 있는 템플릿으로서 json, xml 데이터를 Jackson과 함께 간단하게 파싱해서 사용하는 것이 가능하다. Spring 4부터는 비동기 방식인 AsyncRestTemplate를 지원하기 시작했고, 최근 Spring 5부터는 기존의 동기 방식을 포함할 뿐만 아니라 비동기, 넌블로킹 방식도 WebClient를 지원하기 시작했다. 메서드 RestTemplate의 메서드는 아래와 같다. 1. getForObject : GET 메서드를 이용해 요청한 URL로부터..

Converter를 이용해 URI에 Enum 타입 매핑하기
현재 프로젝트에서 사용자가 자신이 수신한 공지사항, 이벤트, QNA, 파티 매칭 관련한 알림을 필터링 해서 읽을 수 있는 기능을 구현하고 있다. 이 때, URI를 “/notify/{notifyType}” 으로 지정하고 String 타입이 아닌 정의한 Enum 타입으로 받는다면 Stirng 타입에서 Enum타입으로 변경하는 추가 로직을 구현없이 편하게 비즈니스 로직에 접근할 수 있다고 판단했다. 물론 URI의 의미 전달까지 제대로 전달할 수 있다고 생각했다. 그래서, URI 엔드포인트에 들어가는 PathVariable 값을 String 값으로 받는 것이 아닌 바로 정의한 Enum 타입으로 받아보는 방법을 정리하고자 한다. Converter? Spring에서 제공하는 Converter를 먼저 간단하게 확인해..