본문 바로가기
Spring

스프링부트로 쇼핑몰 만들기 - 3주차

by 향로 (기억보단 기록을) 2019. 1. 21.
반응형
  • 지난주에 이어 Web 진행
  • JPA

3-1. exam 프로젝트 까보기

저장소 위치

  • spring-boot-autoconfigure 밑에 있는 spring.factories가 중요함

    • 자동 설정에 관련된 키/값들이 존재함
  • @RestController

    • @Controller, @ResponseBody로 이루어진 어노테이션
    • Spring 4.0 부터 지원
  • Form으로 전송되는 데이터를 받는 방법

    • @RequestParam
    • @ModelAttribute
    • 전송될 필드가 많으면 `@ModelAttribute로 객체로 받을수 있게 한다.
    • 만약 JSON이 온다면 @RequestBody로 처리한다
  • 문자열을 JSON으로 변환해주는 놈?

    • MessageConverter
    • HttpMessageConvertersAutoConfiguration 참고
    • JacksonAutoConfiguration: JSON 컨버터 설정
    • ObjectMapper Bean 이 없다면 자동으로 Bean 생성해줌
      • JacksonObjectMapperConfiguration.jacksonObjectMapper
  • Accept를 통해서 요청자가 원하는 데이터를 만들어서 전달한다

    • text/html, application.json 등등
    • 요청자의 accept보고 다양한 MessageConverter중 골라서 값 전달
  • BoardApiController의 API 테스트

    • Accept: application/json 혹은 Accept: text/xml 로 테스트해보기
    • 추천 Rest API Testing Tool
    • 대신 파라미터에 format=xml 혹은 format=json등으로 하면 Accept와 같은 역할을 한다.
  • 만약 XML 프로퍼티를 설정하고 싶다면

@Data
@AllArgsConstructor
public class BoardList {

    @JacksonXmlElementWrapper(localName = "Boards")
    @JacksonXmlProperty(localName = "Board")
    private List<Board> boards;
}
  • @JacksonXmlElementWrapper
    • boards의 XML 태그명 설정
  • @JacksonXmlProperty
    • boards의 자식 (Board)의 태그명
    • 없다면 Item 으로 태그가 생성될 것
  • ContentNegotiationViewResolver
    • 요청되는 콘텐츠 형식에 기반을 두어 선택한 하나 이상의 다른 뷰 리졸버에 위임한다
    • Freemarker, Thymeleaf 등의 뷰리졸버는 HTML 형식을 대응
    • 이때는 MessageConverter 가 사용되지 않는다
    • 만약 이 리졸버가 처리하지 못하는 형식이라면 다른 리졸버에게 요청을 던진다
  • ThymeleafViewResolver
    • Thymeleaf기반의 템플릿을 찾는다

주의할 점
JSON, XML등은 @RestController를 사용한다.
즉, MessageConverter만 사용되며, 뷰리졸버는 사용되지 않는다.

3-2. JPA와 데이터베이스

기본 설명

  • SQL 모르고는 JPA를 잘할수 없음
  • 어떻게 하면 Java로 DB를 사용할때 DB 종류에 관계없이 동일한 코드로 사용할수 있을까?
    • Connection, PreparedStatement, ResultSet 인터페이스
    • 인터페이스 구현체는 각 DB사에 맡김
      • JDBC Driver
    • 일관된 방법으로 DB를 사용
  • 쿼리는 결국 DB에서 사용되니, Connection을 맺어야만 실행 가능
    • 하지만 Connection을 맺는 작업은 많은 리소스가 필요함
    • 이를 해결하기 위해 Connection Pool을 이용해 재사용으로 문제를 해결
    • Connection Pool의 Connection이 모두 사용중이라면 이후 요청들은 대기하게 된다.

DAO

  • Data Access Object
  • 트랜잭션
    • 하나의 논리적인 작업 단위
    • ex)
      • 1건 조회
      • 조회수 + 1
      • 이 기능이 묶여서 실행되어야함
      • 실패나면 같이 롤백 되어야함
    • 선언적 트랜잭션
      • 설정만 하면 자동으로 트랜잭션 처리되는 방식
      • XML, 어노테이션 등등
      • Spring에선 AOP로 이를 구현 (@Transaction)

JPA

  • 자바 개발자는 객체지향 프로그래밍을 하는데, SQL??
  • 하이버네이트의 등장
    • 유사한 ORM 들이 계속 등장하니, 표준이 생김 -> JPA
  • Spring 입장에선?
    • JPA로는 RDBMS만 가능한데, NoSQL 대응은 어떻게?
    • 이들 모두를 대응하는 추상화 레이어를 하나더 두자
    • Spring Data 가 등장
    • 우린 여기서 Spring Data Jpa를 사용

참고 도서: 자바 ORM 표준 JPA 프로그래밍

  • JPA를 사용하는 이유?
    • SQL 중심 개발 -> 객체 중심 개발
    • 생산성
    • 패러다임의 불일치 해결

개인적인 추천으로.. JPA를 잘하기 위해선 같이 쓰는 사람들이 있어야함
혼자서는 힘듬

  • 패러다임 불일치?
    • 객체: 상속, 다형성, 메소드, 객체 레퍼런스 관계, 레퍼런스를 이용한 순회
    • 릴레이션: 테이블 위주, 메소드 없음, PK를 통한 구별, 다형성 지원하지 않음
  • ORM
    • 객체와 관계형 데이터베이스와의 매핑
    • 이들 사이의 매핑을 ORM 프레임워크가 중간에서 매핑

3-3. JPA 실습

실습 코드

  • 영속성
  • Repository의 1차 캐싱
    • findById 등으로 같은 키로 가져올때면 트랜잭션 내에 호출됐던 결과를 그대로 리턴한다
  • 트랜잭션 내에서는 엔티티 변경 내용이 트랜잭션 끝나는 시점에 자동으로 테이블에 반영 된다.
  • 동일 트랜잭션 내에서는 최적화가 진행된다
    • 처음 가져온 형태와 최종 변경 형태가 같으면 update 쿼리가 실행되지 않는다
    • *


반응형