Backend

1. N+1 문제란? 예를 들면 주문(Orders)과 주문정보(Order_item) 2개의 1:N의 구조의 엔티티가 있다고 가정하자. 주문과 주문정보를 전체 데이터를 조회할때 일반적으로 join문을 사용하여 한번의 쿼리를 통해 데이터를 조회할 수 있다. 그러나 JPA에서는 1번 조회되어야 할게 각각 N번을 추가로 조회하게 되어 총 N+1을 DB에서 조회하게 되는 문제가 발생하게 되는데 이러한 문제를 'N+1 문제'라고 말합니다. N+1 문제는 N:1 , 1:N을 가진 엔티티를 조회할 때 발생하게 됩니다. 2. N+1 문제가 발생하는 경우 - EAGER Loading Fetch type을 EAGER 전략으로 하였을 경우에 N+1문제가 발생한다. 예를 통해 설명을 하면 다음과 같다. 주문(orders) 엔티..
1. 즉시로딩 엔티티를 조회할 때 연관된 엔티티도 함께 조회. 예를 들어 회원 엔티티와 팀 엔티티가 연관이 있는 경우 em.find(Member.class, "member1")를 호출하면 회원 엔티티와 팀 엔티티가 함께 조회된다. 즉시로딩을 사용하기 위해서는 @ManyToOne의 fetch 속성을 FetchType.EAGER로 지정합니다. 아래와 같이 Order 엔티티와 Member 엔티티가 조인쿼리를 사용하여 함께 조회된다. JPA 조인 전략 내부조인(Inner Join)이 아닌 외부조인(Outer Join)이 사용된다. 왜냐하면 JoinColoumn으로 선언된 데이터가 Null 인 경우가 있을 수 있기 때문입니다. Null인 경우 Order 정보도 조회할 수 없습니다. 만약 내부조인을 사용하고 싶은 ..
1. 프록시가 필요한 이유 엔티티를 조회할 때 연관관계를 맺고 있는 다른 엔티티도 같이 조회한다. 연관된 엔티티가 항상 필요하지 않을 수도 있기 때문에 불필요한 데이터 조회가 발생하게 된다. 그렇기에 실제 사용하는 시점에 데이터베이스를 조회할 수 있게 해야하는데 이 때 프록시를 사용하면 된다. 실제 사용될 때까지 DB 조회를 지연시킬 수 있도록 실제 엔티티 대신할 가짜 객체가 필요한데 이를 프록시 객체라고 한다. 2. 프록시 객체 JPA에서 식별자로 엔티티를 조회할 때 'EntityManager.find()'를 사용한다. 이 메소드는 영속성 컨텍스트 내 1차캐시에 엔티티가 없을 경우 DB 조회하여 저장하게 된다. 만약 엔티티를 실제 사용하는 시점까지 DB조회를 지연시키고 싶으면 EntityManger...
1. 서버(세션) 기반 인증 서버 측에서 사용자, 즉 클라이언트의 정보를 세션에 저장하여 기억하는 방식으로 메모리, 디스크, 데이터베이스 등을 통해 관리를 하게된다. 예를 들어 로그인을 하게 되면 세션에 사용자 정보를 저장하고 사용자 정보가 필요한 서비시를 제공할 때 사용하곤 하는 방식이다. 이러한 서버를 Stateful 서버라 한다. 서버(세션) 기반 인증은 세션(session)과 쿠키(Cookie)가 사용되는데 아래와 같이 인증 절차가 진행된다. 서버(세션) 기반 인증 장점 서버에서 세션정보가 관리되므로 상대적으로 안전 서버에 세션정보가 있기 때문에 로그인 상태 여부를 확인하기 수월 서버(세션) 기반 인증 단점 서버 확장성의 어려움 메모리/데이터베이스의 과부화로 성능에 영향 CORS(Cross-Ori..
1.영속성 컨텍스트란? 먼저 엔티티(Entity)의 의미를 먼저 간단하게 알고 넘어가면 엔티티는 다음과 같다. '업무에 필요하고 유용한 정보를 저장, 관리하기 위한 개념'으로, 실체, 객체라는 의미이다. 예) 엔티티-직원 / 속성- 주소, 사번, 휴대전화번호 등등 영속성 컨텍스트(Persistence context)는 '엔티티를 영구히 저장하는 환경' 이라는 의미를 가집니다. 어플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 DB 같은 역할을 하게된다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 만들어지며 엔티티 매너저를 통해 접근 관리된다. 2. 엔티티 매니저란? 엔티티를 영속성 컨텍스트에 저장, 보관 등의 관리를 하는 역할을 한다. 엔티티 매니저에 엔티티를 저장하거나 조회하게 되면 엔티티 ..
1. Stateless란? Stateless는 클라이언트와 서버와의 관계에서 서버측에서 클라이언트에 대한 상태를 보존하지 않는 것으로, 별도의 세션 정보를 기록하지 않는 방식을 의미한다. 즉, 클라이언트와 서버간의 연결이 지속하여 연결된 상태가 아니므로 서버에서는 클라이언트의 현재 상태를 알 수 없다. Stateless의 경우 클라이언트에서는 어떠한 작업을 서버로 요청할 때 각각의 상태를 명확하게 요청하게 된다. 그렇기 때문에 서버측에서는 클라이언트에서 요청한 사항에 대해서만 응답을 처리하면 된다. 대표적으로 RestFul이 Stateless 방식이다. ex) 노트북 가격 알려줘, 판매 가능 노트북 리스트 알려줘. 앞서 설명한 바와 같이 클라이언트와 서버간에 연결이 되지 않은 상태이므로 서버 측에서 서버..
야뤼송
'Backend' 카테고리의 글 목록 (4 Page)