본문 바로가기

개발 공부

(32)
영속성 컨텍스트? 1-1 영속성 컨텍스트의 정의 영속성 컨텍스트란 엔티티를 영구 저장하는 환경. persist() 메소드는 엔티티 매니저를 사용하여 엔티티를 영속성 컨테스트에 저장한다. 엔티티의 생명주기에는 4가지 상태가 있음. 각각 비영속, 영속, 준영속, 삭제 비영속 순수한 객체 상태. 영속성 컨텍스트나 DB와는 전혀 관련이 없음. // 객체를 생성한 상태 Member member = new Member(); member.setId("member1"); member.setUsename("회원1"); 영속 엔티티 매니저를 통해 영속성 컨텍스트에 저장. 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 함. 즉, 영속상태란 영속성 컨텍스트에 의해 관리 된다는 것. //객체를 저장한 상태(영속) em.persist(member); ..
JPA의 더티 체킹 JPA의 더티 체킹(Dirty Checking) 이터베이스의 엔티티 상태가 변경되었을 때 이를 자동으로 감지하여 업데이트하는 기능 JPA가 제공하는 영속성 컨텍스트의 한 기능으로, 엔티티의 상태를 관리하며, 트랜잭션이 종료될 때 변경된 엔티티를 데이터베이스에 자동으로 반영 함. 동작방식? 엔티티 조회 및 변경: 영속성 컨텍스트에 엔티티를 로드할 때, 해당 엔티티의 원본 상태를 스냅샷으로 보관 → 개발자가 엔티티의 상태를 변경하면, 이 변경 사항은 아직 데이터베이스에는 반영되지 않은 상태. 변경 감지: 트랜잭션이 종료되어 커밋되기 전, 영속성 컨텍스트는 엔티티의 현재 상태와 저장해둔 원본 스냅샷을 비교. 이 과정에서 변경된 부분을 감지 함. 더티 체킹 실행: 변경이 감지된 엔티티에 대해, JPA는 자동으로..
N+1 문제 발생 이유 N+1 문제는 주로 ORM(Object-Relational Mapping) 툴을 사용할 때 발생한다. 예를 들어, 한 개의 부모 엔티티와 여러 개의 자식 엔티티가 있는 관계에서 부모 엔티티를 조회할 때 자식 엔티티들도 함께 조회하는 상황을 생각해 보자. 여기서 발생하는 문제는 아래와 같다. 먼저 부모 엔티티를 조회하는 쿼리 실행. (1번의 쿼리) 그 다음 각 부모 엔티티에 대응하는 자식 엔티티들을 조회하기 위해 부모 엔티티 수만큼 추가 쿼리를 실행. (N번의 쿼리) 결국, 부모 엔티티 1개를 조회하기 위해 1번의 쿼리가 실행되고, N개의 자식 엔티티를 조회하기 위해 추가로 N번의 쿼리가 실행되어 총 N+1번의 쿼리가 실행되는 것. 이는 데이터베이스에 과도한 부하를 주고 응답 시간을 증가시키는 ..
AOP, Interceptor, Filter AOP (Aspect-Oriented Programming) 개념: AOP는 관점 지향 프로그래밍으로, 애플리케이션의 핵심 로직에서 분리된 관심사( ex: 로깅, 보안, 트랜잭션 관리 등)를 모듈화하는 프로그래밍 패러다임. 역할: 메소드의 호출 전후, 예외 발생 등에 대한 공통 기능을 적용할 수 있다. 장점: 코드 중복을 줄이고, 핵심 로직과 공통 관심사를 분리하여 코드의 가독성과 유지보수성을 향상시킨다. Interceptor 개념: Interceptor는 특정 코드 조각( ex: 컨트롤러 메소드)이 호출되기 전후에 추가적인 작업을 수행하는 객체. 역할: 주로 MVC 모델에서 컨트롤러의 액션 처리 전후에 사용되며, 로깅, 인증, 권한 검사 등에 사용. 장점: 특정 컨트롤러나 액션에 대한 세밀한 제어가 가..
스프링의 Lifecycle 초기화 (Instantiation) Bean 정의: 스프링 설정 파일에 Bean이 정의되거나, 어노테이션을 통해 Bean이 정의 됨. Bean 인스턴스 생성: 스프링 컨테이너는 Bean 정의를 기반으로 Bean 인스턴스를 생성. 의존성 주입 (Dependency Injection): Bean이 다른 Bean에 의존하는 경우, 스프링은 의존성을 주입. Bean 초기화: Bean 인스턴스가 생성되고, 의존성이 주입된 후 초기화 메서드가 호출 됨. 이는 @PostConstruct 어노테이션 또는 XML 설정을 통해 정의될 수 있다. 사용 (Use) Bean 사용: 초기화된 Bean은 애플리케이션에서 필요에 따라 사용. Bean 생명주기 관리: 스프링 컨테이너는 Bean의 전체 생명주기 동안 Bean을 관리. ..
오버라이드와 오버로드 오버라이드 (Override) 오버라이드는 자식 클래스가 부모 클래스에서 상속받은 메소드를 재정의하는 것. 상속: 오버라이드는 상속을 통해 이루어진다. 자식 클래스가 부모 클래스의 메소드를 재정의한다. 동일한 시그니처: 재정의하는 메소드는 부모 클래스의 메소드와 동일한 이름, 매개변수, 반환 타입을 가져야 함. 다형성: 오버라이드는 다형성의 한 예. 부모 클래스 타입의 변수가 자식 클래스의 오버라이드된 메소드를 호출할 수 있다. // 예시 코드 class Parent { void display() { System.out.println("Parent display()"); } } class Child extends Parent { @Override void display() { System.out.prin..
Spring Security의 구조 Spring Security의 구조 핵심 구성 요소 AuthenticationManager: 인증 프로세스를 관리. 이는 Authentication 객체를 받아 유효한지 확인 함. Authentication: 사용자의 인증 정보를 나타내는 객체. UserDetails: 사용자의 정보를 담고 있는 객체. 사용자의 이름, 패스워드, 권한 등을 포함. UserDetailsService: 사용자 정보를 가져오는 인터페이스. 일반적으로 데이터베이스에서 사용자 정보를 조회하는 데 사용. 인증 과정 (Authentication Process) 사용자가 로그인 정보를 입력. AuthenticationManager는 UserDetailsService를 사용하여 사용자의 정보를 조회. 조회된 정보와 입력된 정보를 비교하여..
JWT 발급 과정 JWT 발급 과정 사용자 인증 사용자는 로그인 정보를 제공 Spring Security는 이 정보를 사용하여 사용자를 인증. JWT 생성 인증에 성공하면 서버는 토큰 생성. 일반적으로 사용자의 식별 정보, 권한, 유효 기강 등을 포함한다. 서명을 통해 보안이 강화된다. (HMAC 알고리즘 또는 RSA 키 사용) JWT 발금 생성된 JWT는 클라이언트에게 반환한다. 클라이언트는 이후의 요청에서 이 JWT를 사용하여 자신을 인증함. JWT 검증 클라이언트로부터 요청이 들어올 때, JWT는 서버에 의해 검증된다. JWT의 유효성, 만료 시간, 서명 등이 확인된다. 권한 부여 및 리소스 접근 JWT가 유효하다면, 사용자는 권한에 따라 시스템의 리소스에 접근할 수 있다. 프론트를 할 때 JWT로 고생했던 적이 있..