WEB 158

실전! Spring Data JPA 1,2(공통 인터페이스 기능, 쿼리 메소드 기능)

public interface MemberRepository extends JpaRepository { } 이렇게 해놓으면 Spring Data JPA가 프록시 객체를 만들어서 필요한 곳에 위 인터페이스 구현체를 집어 넣어준다. @Repository 생략해도 괜찮다. 기본적으로 Spring Data가 공통적으로 제공되는 기술과 특화된 기술을 제공해주는 파트가 나뉘어져있다. 쿼리 메소드 기능 public interface MemberRepository extends JpaRepository { List findByUsernameAndAgeGreaterThan(String username, int age); } public List findByUsernameAndAgeGreaterThan(String use..

WEB/JPA 2021.04.12

실전! 스프링부트와 JPA와 활용2 (OSIV와 성능 최적화)

spring.jpa.open-in-view = true가 default다. 트랜잭션이 끝나도 api 단에서 lazy loading 때문에 프록시를 초기화하는 경우가있기에 db connection 을 계속 가지고 있다. application에서 응답이 나갈떄까지 끝까지 살아 있다. 지연로딩이 가능했던 이유이다. 하지만 커넥션을 너무 오래 들고 있기 때문에 실시간 트래픽이 중요한 앱에서는 커넥션이 모자라 장애로 이어 질 수 있다. 영속성컨텍스트 view rendering이 끝나는 시점에 끝난다. 즉 view rending 도중에도 영속성 컨텍스트에서 도움을 받을 수 있다. OSIV Off db connection을 짧은 기간 동안 만 유지하는 것이다. 커넥션 리소스를 낭비하지 않게 될 수 있다. 모든 laz..

WEB/JPA 2021.04.06

실전! 스프링부트와 JPA와 활용2 (컬렉션 조회 최적화)

컬렉션 조회 최적화 컬렉션같은 x to many의 경우 데이터가뻥튀기 되어서 돌아온다. public List findAllWithItem() { return em.createQuery( "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class) .getResultList(); } @GetMapping("/api/v3/orders") public Result ordersV3() { List orders = orderRepository.findAllWithItem(); List re..

WEB/JPA 2021.04.06

실전! 스프링 부트와 JPA 활용2 (API 개발기본 , 지연로딩과 조회 성능 최적화)

@PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data static class CreateMemberRequest { private String name; } REST API spec에 맞는 DTO를 따로 만들어 사용해야한다. Entity를 그대로 사용하게되면 유지보수도 힘들고 a..

WEB/JPA 2021.04.03

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(스프링 MVC - 기본기능)

로그 간단히 알아보기 SL4J는 인터페이스이고 구현체로 Logback을 사용한다. Logback말고도 여러 다른 구현체가 존재한다. 2021-03-29 14:18:13.367 INFO 9304 --- [nio-8080-exec-1] hello_mvc1.demo.basic.LogTestController : info log = spring 이런식으로 여러 정보를 한꺼번에 보여준다. 또한 log.info 말고도 trace, debug ,info, warn, error 등등 을 쓸 수 있다. 뒤로 갈수록 심각도 가 높아지게되고 application.properties를 통해 설정을 할 수가 있다. log.trace("trace mylog{}, name) 이런 식으로 써야지 log.trace("trace myl..

WEB/Spring MVC 1 2021.03.30

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(스프링 MVC - 구조이해)

1. 핸들러조회 = 핸들러 매핑을 통해 요청 URL 에 매핑된 핸들러(컨트롤러)를 조회한다. 2. 핸들러 어댑터 조회 = 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다. 3. 핸들러 어댑터 실행 = 핸들러 어댑터를 실행한다. 4. 핸들러 실행 = 핸들러 어댑터가 실제 핸들러 를 실행한다. 5. ModelAndView반환 = 핸들러 어뎁터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다. 6. viewResolver 호출 = 뷰 리졸버를 찾고 실행한다. JSP의 경우 = InternalResourceViewResolver가 자동 등록되고, 사용된다. 7. View 반환 = 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. JSP의 경..

WEB/Spring MVC 1 2021.03.29

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(MVC 프레임워크 만들기)

FrontController 프론트 컨트롤러의 도입함으로써 하나의 입구를 만들어 공통된 기능을 용이하게 처리할 수 있다. 프론트 컨트롤러를 제외한 나머지는 서블릿을 사용하지 않아도 된다. 스프링 웹 MVC의 DispatcherServlet이 FrontController 패턴으로 구현되어 있음. @WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*") public class FrontControllerServletV1 extends HttpServlet { private Map controllerMap = new HashMap(); public FrontControllerServletV1() { control..

WEB/Spring MVC 1 2021.03.29

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(서블릿,JSP,MVC패턴)

서블릿과 JSP의 한계 서블릿으로 개발할 때는 view 화면을 위한 html 을 만드는 작업이 자바코드에 섞여가지고 지저분하고 복잡. JSP 경우 코드의 상위 절반은 비즈니스로직이고 나머지 하위 절반은 HTML 보여주기위한 view영역이다. JSP가 너무 많은 역할을 담당한다. 유지보수 HELL MVC 패턴의 등장 Controller = HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다. Model = 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다. View = 모델에 담겨있는 데이터를 사용..

WEB/Spring MVC 1 2021.03.28