본문 바로가기

Spring132

상속관계 매핑 ( @Inheritance , @DiscriminatorColumn ) 관계형 데이터 베이스에서는 상속 관계라는 것은 없다. 다만 슈퍼타입, 서브타입 관계라는 모델링 기법이 있으며 상속관계와 비슷하다. 아래와 같은 관계를 상속관계 매핑으로 나타내는 3가지 방법에 대해 알아보자. 상속관계 매핑의 방법 3가지 매핑방법 어노테이션 설명 조인전략 @Inheritance(strategey = InheritanceType.JOINED) 각각 테이블 단일 테이블 전략 @Inheritance(strategey = InheritanceType.SINGLE_TABLE) 통합 테이블 구현 클래스마다 테이블 전략 @Inheritance(strategey = InheritanceType.TABLE_PER_CLASS) 서브 타입 테이블 1. 조인 전략 - 공통된 부분을 부모처럼 사용하며 extend.. 2022. 9. 23.
연관 관계 매핑 연관관계에서 고려해야할 점은 아래와 같다 1. 다중성 - 일대다 / 다대일 / 다대다 / 일대일 2. 방향 - 단방향 / 양방향 3. 연관 관계의 주인 다중성 - 일대다 ( 1: N ) @OnetoMany - 다대일 ( N:1 ) @ManytoOne - 다대다 ( N:M ) @ManytoMany - 일대일 ( 1:1 ) @ OnetoOne 방향 - 단방향 : 한쪽으로 가는 방향 - 양방향 : 양쪽으로 가는 방향 DB 테이블에서는 외래키(FK) 하나로 조인을 사용해서 양방향으로 쿼리가 가능하다. ** DB 에서는 방향이라는 개념이 없다 객체는 방향의 개념이 존재한다. 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있다. ?? 무조건 양방향 관계를 하면 안될까 ?? - 일반적인 비즈니스에서 엔티.. 2022. 9. 22.
연관 관계가 필요한 이유 연관관계가 필요한 이유 : 협력 공동체를 만들 수 없다. Member.class - 현재 teamId 를 Long 타입으로 가지고 있다. @Entity public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @Column(name = "username") private String name; @Column(name = "team_id") private Long teamId; Team.class @Entity public class Team { @Id @GeneratedValue @Column(name = "team_id") private Long id; private String name; 객체를 테이블에.. 2022. 9. 21.
유효성 검사(Validation) 유효성 검사 / 데이터 검증 (Validation) - 서비스의 비즈니스 로직이 옳바르게 동작하기 위해 사용되는 데이터에 대한 사점 검증하는 작업 - 데이터의 검증은 여러 계층에서 발생 - 데이터에 대해 의도한 형식의 값이 제대로 들어오는지에 대해 체크하는 과정 일반적인 Validation 은 문제가 많았다. 어플리에킹션 전체적으로 분산이 되어있었고, 코드의 중복이 심하고, 비즈니스 로직에 섞여 추적이 어려웠다. 이런 문제를 해결하기 위해 Bean Validation 프레임워크가 제공되었다. 어노테이션을 통해 다양한 데이터를 검증할 수 있다. 어노테이션 설명 @Size 문자의 길이 조건 @NotNull null 값 불가 @NotEmpty @NotNull + "" 값 불가 @NotBlank @NotEmpt.. 2022. 9. 21.
Logback 설정 + 테스트 - 로그에 특정 레벨을 설정할 수 있다. 1. Trace 2. Debug 3. Info 4. Warn 5. Error 로깅을 하는 이유? - 실운영과 테스트 상황에서 각각 다른 출력 레벨을 설정하여 로그를 확인 가능 - 출력 방식에 대해 설정가능 - 설정 파일을 일정 시간마다 스캔하여 어플리케이션 중단 없이 설정 변경 가능 - 별도의 프로그램없이 자체적으로 로그 압축 지원 - 로그 보관 기간 설정 가능 설정방법 ( xml 파일 ) - logback-spring.xml 파일 참조하는 것이 일반적 appender : Log의 형태 및 어디에 출력할지 설정하기 위한 영역 - ConsoleAppender : 콘솔에 로그를 출력 - FileAppender : 파일에 로그를 저장 - RollingFileAppend.. 2022. 9. 21.
필드와 컬럼 매핑 필드에 컬럼 매핑을 통해 DB 에 제약조건을 줄 수 있다. * JPA 의 실행 로직에는 영향을 주지 않으며, DDL을 자동생성 할 때만 사용한다 예로 들어보자 @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @Lob pri.. 2022. 9. 20.
데이터베이스 스키마 자동 생성 DDL ( Data Definition Language ) : 데이터 정의어 - 데이터를 생성하거나 수정, 삭제 등 데이터의 전체 골격을 결정한다 - JPA 를 사용 및 @Entity를 붙여주면 DDL을 애플리케이션 실행 시점에 자동으로 생성한다. @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @Temporal(TemporalType... 2022. 9. 20.
객체와 테이블 매핑 객체와 테이블을 매핑하기 위해서는 @Entity를 클래스 위에 작성한다. JPA 를 사용해서 테이블과 매핑할 클래스는 필수로 작성해주어야 한다. @Entity가 붙은 클래스는 JPA가 관리, 엔티티라고 부른다. @Entity public class Member { @Id private Long id; private String name; 주의할 점 1. 기본생성자는 필수 2 . final 클래스를 사용해서는 안된다 -> JPA 구현체들은 엔티티를 내부에서 다양한 방식으로 사용 @Entity 의 속성정리 name() - JPA에서 사용할 엔티티 이름을 지정 - 기본값은 클래스의 이름을 그대로 사용 - 같은 클래스 이름이 없으면 가급적 기본값을 사용 @Entity(name = "MBR") public cla.. 2022. 9. 20.
영속성 컨텍스트 - 플러시 플러시 : 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영 - 플러시가 발생할 때의 예 1. 변경감지 2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록할 때 3. 쓰기지연 SQL 저장소의 쿼리를 데이터 베이스에 전송 - 플러시 하는 방법 1. em.flush() - 직접 호출 2. transaction.commit - 트랜잭션 커밋 3. JPQL 쿼리 실행 - 플러시는 영속성 컨텍스트를 비우지 않는다 : 영속성 컨텍스트의 소스를 DB에 적용시키는 것 뿐이다. - 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다. - 커밋 직전에만 동기화 하면된다. 플러시 모드 옵션 - 변경을 추천하지 않으며 자동(기본값)을 사용하자. 2022. 9. 20.