API15 11. SAI(RestAPI) 사용 설명서 1. SAI는 어떻게 동작하나요? - SAI는 JWT를 기반으로 요청과 응답을 제공하는 RestAPI 서버입니다. - JWT는 회원가입, 일반 로그인에서 제공됩니다. a) Filter - 회원가입과 일반 로그인을 요청할 때에는 JWT를 기반한 검증을 수행하지 않습니다. - 그 외의 요청을 할 때에는 반드시 유효한 JWT를 쿠키로 보유하고 있어야 합니다. - 이 부분은 Filter를 이용하여 구현했습니다. - 아래의 코드는 JwtFilter 클래스의 한 부분입니다. @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException.. 2022. 9. 14. 9. 개선사항(비즈니스 로직 제거, Exception Handler 적용, DataIntegrityViolationException 처리 방법) 0. 개요 - 우연한 기회로 SI 업체에 면접을 보러 가게 되었다. - 많은 기대는 하지 않았지만, 기대 이상으로 면접 경험이 좋았다. - 문답 형식의 이론 질문이 없었고 코드를 보여주고 해당 코드를 분석하는 방식의 면접이었다. - 확실히 다른 사람이 작성한 코드에서 그 맥락을 모른 체 문제점을 파악한다는 것은 아직은 쉽지 않다. - 면접에서 내가 작성한 사이(SAI)의 코드를 보면서 RestAPI, Java, Spring에 관련된 질문을 받았다. - 그 과정에서 몇 가지 프로젝트의 개선사항을 듣게 되었고 하나씩 개선해보았다. 1. 비즈니스 로직은 Service에서 처리하자. a) 고민은 개선의 시작 - 사실 SAI를 만들면서 방법론적인 고민을 많이 했다. - 그중 하나가 비즈니스 로직의 기준에 대한 고.. 2022. 9. 12. API 조회 성능 최적화 - 컬렉션(DTO 직접 조회) 0. 개요 - 이번 포스팅에서는 DTO를 직접 사용하여 컬렉션을 조회하는 방식에 대해서 알아보자. 1. DTO 직접 조회 준비 a) DTO 직접 조회의 의미 - 단일 조회 시 DTO를 직접 사용한 조회 방법과 동일하게 컬렉션도 DTO를 사용하여 직접 조회할 수 있다. - DTO 직접 조회 방식의 핵심은 Entity를 전혀 사용하지 않고 오직 DTO만을 이용하여 데이터를 받아오는 것이다. - 즉, Entity를 조회하고 그 데이터를 이용하여 DTO를 생성 및 반환하는 작업이다. - 언뜻 보면 DTO 변환 방식과 특별한 차이점을 못 느낄 수도 있다. - 그러나 DTO 직접 조회 방식은 API 메서드에서 오직 DTO만을 사용한다는 것이 특징이다. b) 준비 작업 확인 - 우선 DTO 변환을 이용한 조회 메서드.. 2022. 6. 4. API 조회 성능 최적화 - 컬렉션(Fetch Join + 페이징 + Batch Size) 0. 개요 - 이전 포스팅에서 Fetch Join을 사용하면 페이징을 사용할 수 없다는 것을 배웠다. - 그러나 개발을 하다 보면 Fetch Join과 페이징이 함께 필요한 경우가 발생할 것이다. - 이러한 상황에서 어떻게 페이징을 구현할 수 있는지 알아보자. 1. Fetch Join + 페이징 사용 불가 a) 근본적인 이유 - Fetch Join은 일대다(= OneToMany) 조인에서 사용된다. - 일대다(= OneToMany) Join의 목적은 일(= One)을 기준으로 Join 하는 것이다. - 그러나 DB는 다(= Many)를 기준으로 Join 하므로 결과 데이터가 다(= Many)의 개수만큼 생성된다. - 이처럼 결과 데이터의 증가로 인해, 데이터의 순서가 뒤틀리게 되어 페이징을 사용할 수 없.. 2022. 6. 3. API 조회 성능 최적화 - 컬렉션(Fetch Join, distinct) 0. 개요 - 이전 포스팅에서 DTO 변환을 이용한 컬렉션 조회 방법을 알아보았다. - DTO 변환 방법을 사용하여 컬렉션 조회 시, 다수의 SQL 문이 발행된다는 문제점을 확인하였다. - 이 문제를 해결하기 위해 Fetch Join을 이용한 컬렉션 조회 방법을 알아보자. 1. DTO 변환 + Fetch Join a) Fetch Join 쿼리 작성 - 우선 Fetch Join을 이용하는 쿼리를 작성해보자. - 쿼리는 다음과 같다. public List findAllWithItem() { return em.createQuery("select o from Order o " + "join fetch o.member " + "join fetch o.delivery " + "join fetch o.orderIte.. 2022. 6. 2. API 조회 성능 최적화 - 컬렉션(DTO 변환) 0. 개요 - 이전 포스팅까지 Many To One 또는 One To One 관계에 대한 조회 방식을 알아보았다. - To One 관계는 Join 대상이 하나인 관계로, Fetch Join을 이용하여 N + 1 문제를 해결하였다. - To Many의 관계는 Join 대상이 다수인 관계로, 중복 데이터가 발생하는 문제를 가진다. - 이번 포스팅에서 To Many 관계를 조회할 때 발생하는 문제와 해결책에 대해서 알아보자. 1. 컬렉션 조회 시 DTO 변환 방식 a) 예시 코드 - 다음과 같이 DTO를 사용하여 컬렉션 조회를 수행하려고 한다. @RestController @RequiredArgsConstructor public class OrderApiController { private final Orde.. 2022. 6. 1. API 조회 성능 최적화 - DTO 변환 방식(Fetch Join) 1. 조회 API에서 DTO를 사용하는 이유 - 이전 포스팅에서 Entity를 직접 사용한 조회 API를 구성하는 방법에 대해 알아보았다. - Entity를 직접 노출하는 방식은 Entity의 내용이 변경됐을 때, API 스펙에 직접적인 영향을 미치기 때문이다. - 그러므로 Entity 대신 DTO를 사용하여 이를 해결한다. 2. DTO를 이용한 조회 API 구성 방법 - API에서 DTO를 구성하는 방식은 매우 간단하다. - 기존에 Entity가 직접 사용된 부분을 DTO로 교체하면 된다. - 다음 코드를 살펴보자. @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepos.. 2022. 5. 30. API 조회 성능 최적화 - Entity 직접 노출 방식 - 이번 포스팅부터 단일 객체를 조회하는 API 성능을 최적화 하는 방식에 대해서 알아 볼 예정이다. - 여기서 단일 객체란 Many To One 또는 One To One 관계를 가지는 객체를 의미한다. - 단일 객체를 조회하는 방식에는 Entity 직접 노출, DTO 변환, DTO 직접 사용 방식이 있다. - 이에 대해 하나씩 알아보자. 1. Entity 직접 노출 방식의 문제점과 해결방법 - 결론부터 말하면, 이 방식은 사용하지 않는다. - Entity를 직접 노출하는 방식은 Entity의 내용 변동이 있는 경우, API 스펙에도 변경사항이 발생하기 때문이다. - 즉, API 스펙에 영향을 끼치는 구조이므로 사용하지 않는다. - 다만, Entity 직접 노출 방식을 사용하지 않는 이유에 대해서 이해할.. 2022. 5. 28. JPA를 이용한 API 개발 꿀팁 - Annotation 1. API 컨트롤러를 분리한다. - API를 제작하기 이전에 기본적인 CRUD기능을 다루는 컨트롤러를 생성했을 것이다. - 그리고 API를 제작할 때에는 API 컨트롤러를 저장할 패키지를 따로 만들어 사용한다. 2. @Valid, @NotEmpty a) @Valid - API를 통해서 POST 메서드로 데이터를 DB에 저장하거나 변경할 때에는 @Valid와 @NotEmpty를 사용한다. - @Valid는 javax 라이브러리의 기능으로 유효성을 검사하는 기능을 갖는다. b) @NotEmpty - @NotEmpty는 @Valid에서 검증하는 조건(= constraints) 중 하나다. - @NotEmpty가 부착된 Entity의 필드 값을 required로 처리한다. - 이처럼 반드시 필요한 값이 입력되.. 2022. 5. 27. 이전 1 2 다음