분류 전체보기 97

다양한 연관관계 맵핑

연관관계 매핑 시 고려사항 3가지 다중성 단방향, 양방향 연관관계의 주인 다중성 다대일: @ManyToOne 일대다: @OneToMany 일대일: @OneToOne 다대다: @ManyToMany 다중성 같은 경우 간혹 헷갈릴 경우가 발생한다. 그럴 때는 반대쪽으로 생각해보면 된다. 회원과 팀이면 반대로 팀과 회원의 관계를 생각해보면 된다. 일대일의 반대는 일대일, 일대다의 반대는 다대일, 다대다의 반대는 다대다로 대칭 성이 있기 때문이다. 하지만 무엇보다도 중요한건 실무에서는 다대다를 쓰면 안 된다. 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 연관관계 주인 테이블은 외..

연관관계 맵핑 기초

연관관계 맵핑 목표 객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 용어 방향(Direction): 단방향, 양방향 다중성 : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해 연관관계의 주인(Onwer): 객체 양방향 연관관계는 관리 주인이 필요 연관관계가 필요한 이유 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다. 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계다. 단방향 연관관계 1) 객체를 테이블에 맞추어 모델링 2) 객체를 테이블에 맞추어 모델링 package helloJpa; import javax.persistence.EntityManager; import javax..

JPA 엔티티 매핑

엔티티 맵핑 소개 @Entity, @Table : 객체와 테이블 매핑 @Column : 필드와 컬럼 매핑 @Id : 기본 키 매핑 @ManyToOne, @JoinColumn : 연관관계 매핑 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리한다 JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 가 필수이다. 주의 기본 생성자 필수 final 클래스, enum, interface, inner 클래스 사용하지 못한다. 저장할 필드에 final 사용할 수 없다. @Entitiy name 속성 JPA에서 사용할 엔티티 이름을 지정한다. 기본값은 내 클래스명과 동일 한 값을 사용한다. 같은 클래스 이름이 없으면 가급적 기본값을 사용한다. @Table @Table은 엔티티와 매핑..

JPA 영속성 컨텍스트

영속성 컨텍스트 JPA를 공부할 때 가장 중요한 2가지가 있다. 객채와 관계형 데이터베이스를 맵핑하는 것 영속성 컨텍스트를 이해하는 것 엔티티 매니저 팩토리와 엔티티 매니저 엔티티 매니저 팩토리를 통해서 고객의 요청이 올 때마다 EntityManager를 생성한다. EntityManager 매니저는 내부적으로 데이터베이스 커넥션을 통해서 DB를 접근한다 영속성 컨텍스트 "엔티티를 영구 저장하는 환경"이라는 뜻 EntityManager.persist(entity) 객체를 DB에 저장하는 거라고 배웠지만 실제로는 깊은 내용이 있다. 엔티티를 영속성 컨텍스트라는 곳에 저장하는 것이다. 엔티티 매니저? 영속성 컨텍스트? 엔티티 매니저를 생성하면 눈에 보이지 않는 영속성 컨텍스트에 담긴다. 엔티티의 생명주기 비영..

빈 스코프 - 웹 스코프

지금까지 싱글톤과 프로토타입 스코프를 학습했다. 싱글톤은 스프링 컨테이너의 시작과 끝까지 함께하는 매우 긴 스코프이고, 프로토타입은 생성과 의존관계 주입, 그리고 초기화까지만 진행하는 특별한 스코프이다. 이번에는 웹 스코프에 대해서 알아보자 웹 스코프의 특징 웹 스코프는 웹 환경에서만 동작한다. 웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료 시점까지 관리한다. 따라서 종료 메서드가 호출된다. 웹 스코프 종류 request: HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다. session: HTTP Session과 동일한 생명주기를 가지는 스코프 application: 서블릿 컨텍스트( ServletContext..

빈 스코프 - 프로토타입 스코프와 싱글톤 빈 함께 사용시 Provider로 해결

ObjectFactory, ObjectProvider 의존관계를 외부에서 주입(DI) 받는 게 아니라 이렇게 직접 필요한 의존관계를 찾는 것을 Dependency Lookup (DL) 의존관계 조회(탐색) 이라 한다. 지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 바로 ObjectProvider이다. 참고로 과거에는 ObjectFactory가 있었는데, 여기에 편의 기능을 추가해서 ObjectProivder가 만들어졌다. package hello.core.scope; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.ObjectProvider; import org.springframework.bea..

빈 스코프 - 프로토타입 스코프, 싱글톤 빈과 함께 사용시 문제점

빈 스코프란? 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 다양한 스코프를 지원한다. 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 웹 관련 스코프 request : 웹 요청이 들어오고 나갈 때까지 유지되는 스코프이다. session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다. application : 웹의 서브릿 컨텍스트와 같은 범위로 유지되는 스코프이다. 프로토타입 스코프 싱글톤 스코프의 빈을 조회화면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다. 반..

빈 생명주기 콜백

빈 생명주기 콜백 시작 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 간단하게 외부 네트워크에 미리 연결하는 개체를 생성한다고 가정해보자. 단순히 문자만 출력하도록 했다. 아래 예제를 보자 1) 네트워크 클라이언트 객체 생성 package hello.core.lifecycle; public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url" + url); connect(); call("초기화 연결 메세지"); } publi..

의존관계 자동 주입 - 자동, 수동의 올바른 실무 운영 기준

편리한 자동 기능을 기본으로 사용하자 스프링이 나오고 시간이 갈수록 점점 자동을 선호하는 추세다. 스프링은 @Componet 뿐만 아니라, @Controller, @Service, @Repository처럼 계층에 맞추어 일반적인 애플리케이션 로직을 자동으로 스캔할 수 있도록 지원한다. 거기에 더해서 최근 스프링 부트는 컴포너틑 스캔을 기본으로 사용하고, 스프링 부트의 다양한 스프링 빈들도 조건이 맞으면 자동으로 등록하도록 설계했다. 그러면 수동 빈 등록은 언제 사용하면 좋을까? 애플리케이션은 크게 업무 로직과 기술 지원 로직으로 나눌 수 있다. 업무 로직 빈: 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 리포지토리 등이 모두 업무 로직이다. 보통 비즈니스 요..