TIL/Spring

TIL 2024-11-26 (Spring 심화)

myoma 2024. 11. 26. 21:52

1 ) 오늘 학습한 내용

  • HttpMessageConverter
  • Spring 내부 구조
  • Converter, Formatter
  • 1 : N 연관관계
  • 1 : 1 연관관계
  • N : M 연관관계
  • 상속관계 매핑
  • Proxy
  • 지연로딩, 즉시로딩
  • 영속성 전이
  • JPA와 Transaction

 


 

  • HttpMessageConverter
    • 사용처
      1. HTTP 요청 : @RequestBody, @HttpEntity, @RequestEntity<>
      2. HTTP 응답 : @ResponseBody, @HttpEntity, @ResponseEntity<>
    • 우선 순위
      1. byte[]
      2. String
      3. JSON

 

  • Spring 내부 구조

  • ArgumentResolver
    • HTTP 요청이 컨트롤러 메소드에 전달될 때 각 파라미터를 알맞은 객체로 변환하는 인터페이스
  • ReturnValueHandler
    • 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 인터페이스

 

 

  • Converter, Formatter
    • Converter
      • 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스
    • Formatter 
      • 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용하는 인터페이스
    • WebMvcConfigurer
      • 설정을 통해 Converter, Formatter를 추가할 수 있다.
    • ConversionService
      • 어댑터 패턴
      • Converter, Formatter 일관성 있게 사용할 수 있다.
    • HttpMessageConverter
      • ConversionService가 적용되지 않는다.
      • 역할
        • 요청 메시지 본문을객체로 변환
        • 객체를 응답 본문에 입력하는 것
      • JSON을 객체로 변환하는데 Jackson 라이브러리 사용

 

  • 스플링에서 제공하는 대부분의 기능은 인터페이스로 만들어져 있다.
  • 기본적으로 제공하는 구현체들이 다양하다.
  • 만약 확장하고자 하는 영역이 있다면 그 부분을 확장시켜 프로젝트에 적용하면 된다.
    • 확장을 위해 반드시 내부 구조를 알아야한다.

 

 

  • 연관 관계 설정 Annotation
    • N : 1 : @ManyToOne
      • 가장 많이 사용된다.
    • 1 : N : @OneToMany
    • 1 : 1 : @OneToOne
    • N : N : @ManyToMany
      • 조심해서 사용해야 한다.
    • 단방향, 양방향
      • 테이블 : 외래 키(FK) 하나로 모든 테이블 JOIN이 가능하다.
      • 객체 
        • 외래 키가 있는 객체만 참조 가능하다.
          • 단방향
        • 참조용 필드가 양쪽에 있는 경우 양방향
          • 단방향 두개로 이루어진 것이 양방향

 

  • 1 : N 연관관계
    • 단뱡향 
      • 1의 Entity가 외래키를 관리한다.
      • 1(Company)이 N(Tutor)의 외래 키를 수정해야한다.

  • ...
    • 양방향
      • Tutor의 참조용 객체 Company는 읽기 전용 매핑이어야 한다.
      • 만약, 양쪽에서 수정이 가능하면 예측이 불가능해진다.
      • 1 : N 양방향 연관관계의 주인은 Company이다.

 

 

  • 1 : 1 단뱡향
    • 외래 키(FK)의 주인을 선택할 수 있다.
    • 외래 키에 유니크 제약조건이 필요하다.

 

  • 1 : 1 양방향
    • N : 1 양방향 연관관계와 유사하다.
    • 외래 키(FK)가 있는 곳이 연관관계 주인.

 

  • 외래 키 위치 장단점
    1. 주 테이블
      • 장점
        • JPA로 객체 지향적인 개발이 가능해진다.
        • 주 테이블만 조회해도 대상 테이블을 조회할 수 있다.
      • 단점
        • 대상 테이블에 값이 없다면 null이 허용된다.
          • 데이터 무결성을 지키지 못한다.
        • 대상 테이블의 데이터를 참조하기 때문에 삭제될 때 외래 키 값을 처리하는 관리 필요
    2. 대상 테이블
      • 장점
        • 데이터베이스 무결성 보장
        • 주 테이블과 대상 테이블의 연관관계 변경 시 테이블 구조가 유지된다.
      • 단점
        • 조회 성능이 떨어진다.
        • 연관관계 매핑 설정이 복잡하다.
        • 지연 로딩으로 설정해도 즉시 로딩된다.(중요)

 

 

  • N : M 연관관계
    • 문제가 있어 잘 사용하지 않는다.
      • 실제 설계에 추가적인 데이터 필요.
      • 중간 테이블이 숨겨져 있어서 생각지 못한 SQL Query가 실행된다.
      • 외래 키를 묶어서 PK로 설정된다.
    • 문제 해결
      • 중간 테이블을 실제로 Entity로 만들어서 관리한다.
      • ManyToMany가 아닌 OneToMany, ManyToOne을 함께 사용한다.

 

 

  •  상속관계 매핑
    • 조인 전략
      • 각각을 테이블로 만든다.
      • DTYPE으로 어떤 테이블 인지 구분한다.
    • 단일 테이블 전략
      • 하나의 테이블로 만든다.
      • DTYPE으로 어떤 테이블 인지 구분한다.
    • 구현 클래스
      • 구현 클래스 각각을 테이블로 만든다.
    • JPA 단일 테이블 전략은 기본으로 DTYPE 컬럼이 생성된다.

 

 

  • Proxy
    • Proxy 객체
      • 데이터베이스 조회를 지연하는 가짜(Proxy) 객체를 조회한다.
      • 실제 Entity와 비교 실패, instanceof 사용
    • target : 진짜 객체의 참조를 보관한다.
    • 실제 클래스를 상속 받아서 만들어진다.
    • 특징
      • 최초로 사용할 때 한 번만 초기화된다.
      • 프록시 객체를 통해 실제 Entity에 접근할 수 있다.

 

 

  • 지연로딩, 즉시로딩
    • Lazy Loading (지연로딩)
      • 데이터를 실제로 사용할 때 데이터베이스에서 조회하는 방식
      • 지연로딩을 사용하면 proxy 객체를 조회한다.
      • 연관된 객체를 매번 함께 조회하는 것은 낭비인 경우에 사용.
    • Eager Loading (즉시로딩)
      • Entity를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식
      • Proxy 객체를 조회하지 않고 한 번에 연관된 객체까지 조회
      • 매번 함께 조회하는 것이 효율적인 경우에 사용
      • 즉시 로딩은 꼭 필요한 경우일 때만 사용.

 

  • 영속성 전이
    • Cascode
      • JPA에서 특정 엔티티를 저장, 삭제 등의 작업을 할 때 연관된 엔티티에도 동일한 작업을 자동으로 적용하도록 설정하는 기능이다.
      • 지연로딩과 즉시 로딩과 아무 관련 없다.
    • 단일 Entity에 완전히 종속적인 경우 생명주기가 같다면 사용
      • EX) 축구팀이 사라져도 축구장은 그대로 보존된다. (이런 경우 사용 X)
    • 고아 객체
      • JPA에서 부모 엔티티와의 연관관계가 끊어진 자식 엔티티를 뜻함.

 

 

  • 트랜잭션 전파
    • 트랜잭션이 여러 계층 또는 메서드에서 어떻게 처리될지 정의한다.
    • propagation 속성을 통해 트랜잭션의 동작 방식을 제어할 수 있다.
    • 다양한 비지니스 요구 사항에 맞게 복잡한 트랜잭션 흐름을 유연하게 설계할 수 있도록 돕는다.
    • 데이터 무결성과 비지니스 로직의 안정성을 보장할 수 있다.