반응형

📕 오늘 학습 키워드

📔 동기 & 비동기

📑 동기

  • 호출 후 결과를 기다리고 이후 일을 진행

📑 비동기

  • 호출 후 결과를 기다리지 않고 다음 일을 진행. 결과는 향후 처리

📔 DB 격리 수준

📑 Read Committed

  • 다른 트랜잭션이 커밋한 행의 데이터만 읽을 수 있도록 함

📑 Read UnCommitted

  • 다른 트랜잭션이 아직 커밋하지 않은 행의 데이터도 읽을 수 있도록 함

📑 Repeatable Read

  • 같은 트랜잭션에서 같은 행을 다시 읽을 때 다른 트랜잭션의 변경 때문에 값이 달라지지 않도록 함

📑 Serializable

  • 여러 트랜잭션이 동시에 실행돼도, 그 트랜잭션들을 하나씩 순서대로 실행한 것과 같은 결과를 보장

📔 Spring

📑 낙관적 락 & 비관적 락

  • 낙관적 락: 수정 내용을 DB에 반영할 때 읽어둔 @Version 값과 DB의 현재 버전이 같으면 반영하고, 다르면 충돌로 실패시킴. 성공하면 Hibernate가 버전을 올려 저장함
  • 비관적 락: 데이터를 먼저 잠가 다른 트랜잭션의 충돌하는 작업을 기다리게 하거나 실패시킴

📑 즉시 로딩 & 지연 로딩

  • 즉시 로딩(EAGER): 엔티티를 조회할 때 연결된 연관 데이터도 바로 가져옴
  • 지연 로딩(LAZY): 연관 데이터를 처음 사용할 때 가져옴. 사용하지 않으면 해당 조회를 생략할 수 있음

📑 IoC

  • 객체의 생성과 생명주기 관리를 프레임워크에 맡기는 것

📑 DI

  • 객체가 필요로 하는 다른 객체를 외부에서 전달받는 것. 생성자, 메서드 주입 등이 가능함

📑 Spring Data JPA

  • JPA 기반 Repository의 반복 코드(보일러플레이트)를 줄여 구현을 간단하게 해줌

📑 인증

  • 사용자가 누구인지 확인

📑 인가

  • 그 사용자가 특정 기능을 사용해도 되는지 확인

📑 Session

  • 사용자별 로그인 상태 등을 서버의 세션 저장소에 보관함. 새로고침만으로 사라지지 않음

📑 Cookie

  • 브라우저에 저장하고, 조건에 맞는 HTTP 요청에 함께 보내는 작은 데이터
  • 보안은 저장하는 내용과 쿠키 속성 및 사용 방식에 따라 달라짐

📑 Filtering

  • 요청이 서블릿에 도달하기 전과 응답이 클라이언트로 돌아가기 전에 공통 작업을 처리함. 로깅과 보안 처리를 비즈니스 로직과 분리할 수 있음

📕 오늘 학습한 내용

📔 무엇을 배웠는지

📑 @Transactional

  • 메서드가 트랜잭션 안에서 실행되도록 설정하는 어노테이션. 메서드나 클래스에 선언할 수 있음

📑 영속성 컨텍스트

  • 엔티티를 관리하고, 변경 내용을 DB에 반영할 수 있도록 추적하는 공간

📑 @Primary, @Qualifier

  • 같은 타입의 Bean 후보 중 어떤 Bean을 주입할지 선택함
  • @Primary: 같은 타입의 Bean 중 기본으로 선택할 Bean을 지정함
  • @Qualifier: 주입받는 곳에서 원하는 Bean을 구체적으로 지정함

📑 @Order

  • 여러 Bean을 처리할 때 적용할 순서를 지정함

📔 직접 해본 것

📑 간단 회원가입, 로그인

  • 사용자 비밀번호를 BCrypt로 단방향 해싱하여 저장
  • 사용자 정보로 회원가입, ID 중복 방지
  • 로그인 에러 처리
  • 인증
    • 세션 방식: 로그인 성공 시 서버가 세션을 만들고 세션 ID를 쿠키로 전달함. 이후 쿠키의 세션 ID로 로그인 상태를 확인함. 쿠키의 Max-Age와 서버 세션 만료시간은 별개임
    • JWT 방식: 로그인 성공 시 사용자 정보와 만료시간을 포함하고 Secret Key로 서명한 Access Token을 발급함. 이후 요청에서 토큰의 서명과 만료시간을 검증해 사용자를 확인함
  • 인가
    • 관리자인 경우와 아닌 경우를 나눠 처리하도록 단순 구현

📕 학습하며 겪었던 문제점 & 에러

📔 문제 또는 헷갈렸던 점

📑 JPA와 영속성 컨텍스트

  • EntityManagerFactory가 EntityManager를 생성하고, EntityManager가 영속성 컨텍스트를 관리하는 관계
  • 비영속: 객체는 생성됐지만 영속성 컨텍스트가 관리하지 않는 상태
  • 영속: 영속성 컨텍스트가 관리하는 상태
  • 준영속: 관리되던 엔티티가 분리되어 더 이상 관리되지 않는 상태
  • 삭제: DB에서 삭제하도록 요청된 상태
  • 엔티티 상태와 메서드는 구분해야 함. find는 조회, persist는 새 엔티티 등록, merge는 상태 병합, remove는 삭제 요청

📑 같은 인터페이스를 구현한 Bean이 여러 개일 때

  • Food 인터페이스를 구현한 Pizza, Chicken이 모두 Bean으로 등록된 경우
  • Food 타입만으로 주입할 때 후보가 여러 개이면 주입 대상이 모호해지는 오류가 발생할 수 있음
  • 주입받는 파라미터나 필드 이름이 Bean 이름과 일치하면 이름으로 후보를 구분할 수 있음. @Primary 또는 @Qualifier로 선택을 명시할 수도 있음

📕 내일 학습할 내용

📔 다음 학습

  • Spring 심화, N+1, 연관관계, 트랜잭션 전파

더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.