주노 님의 블로그

20240827 본캠프 32일차 TIL 본문

TIL

20240827 본캠프 32일차 TIL

juno0432 2024. 8. 27. 23:09

본캠프 32일차 내용 간단요약

  • 09:00 ~ 10:00 : 코딩 테스트 강의
  • 10:00 ~ 10:30 : 팀 회의
  • 10:30 ~ 12:00 : 스탠다드 실습반 + 정리
  • 12:00 ~ 13:00 : 점심시간
  • 13:00 ~ 13:30 : cs공부
  • 13:30 ~ 14:00 : 집합(?) - 면접 준비 관련..
  • 14:00 ~ 15:00 : 튜터님 인터뷰
  • 15:00 ~ 18:00 : 프로젝트 관련 공부
  • 18:00 ~ 19:00 : 저녁시간
  • 20:00 ~ 21:00 : 튜터님 인터뷰 및 TIL 작성

 


오늘 해야할 일 ✔️ 🔺 ❌

✔️ExceptionHandler 공부하기


스탠다드 실습반 - JPA

더보기

JPA

  • 자바 진영의 표준 ORM 기술
  • 데이터베이스를 객체처럼 사용하기위해서 사용
  • Application과 JDBC사이에서 동작
  • SQL작성 대신 엔티티를 가지고 데이터베이스 작업
  • 엔티티는 영속성 컨텍스트에서 관리

특징

  • 엔티티를 사용하기 위해 JPA가 내부적으로 기본생성자를 이용함(reflcation기술 이용)
  • @GenerationType.IDENTITY : 기본키 생성 전략 > auto_increment 속성을 사용한다는뜻

단방향 매핑

  • JoinColumn은 연관관계의 주인을 설정할때 사용한다
  • FK를 가지고 있는쪽이 주인
  • EAGER : JPA  기본 조회 전략으로 관련 엔티티를 함께 조회함
  • LAZY : 필요할때만 조회한다

양방향 매핑

  • 대부분은 단방향으로 요구사항을 처리 할 수 있음, 단방향 사용을 권장함
  • 순환 참조 오류, 구현복잡도의 문제가 있음

하이버네이트 설정

  • ddl-auto : ~
    create : 애플리케이션이 시작될 때 데이터베이스에 존재하는 모든 테이블을 삭제하고 새로 생성
    update : 그대로 유지하며 변경사항에 대응
    create-drop : 시작될때 테이블을 생성하지만, 종료될때는 삭제 (테스트에서 주로 사용)
    validate :  엔티티와 데이터베이스스키마가 일치하는지 검증(불일치시 실행x)

REPOSITORY

  • 순수JPA기반
    장점 : 엔티티매니저를 직접 제어 및 커스텀한 로직 구현
    단점 : 귀찮은거 계속 짜야함
    @Repository
    public class MemberJpaRepository {
    
        @PersistenceContext
        private final EntityManager entityManager;
    
        public MemberJpaRepository(EntityManager entityManager) {
            this.entityManager = entityManager;
        }
    
        /**
         * 회원 리스트 조회
         */
        public List<Member> findAll() {
            String jpql = "SELECT m FROM Member m";
            TypedQuery<Member> query = entityManager.createQuery(jpql, Member.class);
            return query.getResultList();
        }


  • JPA 인터페이스 기반
    장점 : 귀찮은거 짤 필요없이 거의 구현되어있음
    단점 : 세밀한 제어가 어려움

N+1문제

  • 하나의 쿼리를 수행한후에 N개의 쿼리가 실행될때?
    예를들어 LAZY로딩일때는 미리 데이터를 받아오지 않는다.
    그러면 학생이 등록한 댓글을 들고오려면 무제한 쿼리문이 날라가게 된다 이것이 문제
    그럼 EAGER로 구현함? ㄴㄴ 데이터를 한꺼번에 가져와서 오히려 비효율일수 있음
    FETCH JOIN이 있다
    FETCH JOIN으로 연관된 엔티티를 가져오게 만들었더니 추가 쿼리가 발생하지 않는다.

프로젝트 관련 공부

더보기

3시간 공부한것의 결과는 아래와같이 간단했다 ㅇㅅㅇ...


exceptionHandler

  • @ControllerAdvice / @ExceptionHandler
    스프링에서 특정 예외가 발생하였을때 호출되는 메서드를 정의하는것이다
    컨트롤러 내에서 작동하며 하위 메서드에도 적용이된다
    모든 컨트롤러에 일괄 적용하기위해 @ControllerAdvice를 적용한다

responseEntity

  • 응답 본문과 상태코드를 던져줄수 있다
    return new ResponseEntity<>(responseDto, HttpStatus.OK);

두개의 조합!

//401에러
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException exception)
{
    return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(exception.getMessage());
}

 

IllegalArgumentException을 던진다면 401에러와 함께 body에 메세지를 보내준다

 

public class NoAuthorityException extends RuntimeException
{
    public NoAuthorityException() {
        super("권한이 없습니다.");
    }
}

 

커스텀에러 물론 만들어서

 

//권한이 없다면 403을 반환해야함.
@ExceptionHandler(NoAuthorityException.class)
public ResponseEntity<String> handleAccessDeiedException(NoAuthorityException noAuthorityException)
{
    return ResponseEntity.status(HttpStatus.FORBIDDEN).body("권한이 없습니다");
}

 

이렇게 반환해줄 수 있다.

 

오늘의 회고 & 12시간 몰입했는가? 

살짝 주말과 월요일에 과제구현에 쏟아붇다보니 소홀해진느낌 ㅎㅎ..

'TIL' 카테고리의 다른 글

20240829 본캠프 34일차 TIL  (0) 2024.08.29
20240828 본캠프 33일차 TIL  (0) 2024.08.28
20240826 본캠프 31일차 TIL  (0) 2024.08.26
20240825 주말에도 나와버린 나의 과제 작성기  (0) 2024.08.26
20240823 본캠프 30일차 TIL  (0) 2024.08.23