본문 바로가기
728x90

전체 글196

[JPA] JPA 연관관계 매핑 (다대일, 일대다, 일대일, 다대다) JPA 연관관계 매핑 연관관계 매핑 시 다음 3가지를 고려하여 매핑해야한다. 1) 다중성 다대일 (N : 1) ManyToOne 일대다 (1 : N) OneToMany 일대일 (1 : 1) OneToOne 다대다 (N : N) ManyToMany 2) 방향 양방향, 단방향 DB 테이블은 외래 키(Fk)하나로 조인을 사용해서 양방향으로 쿼리가 가능하다. 따라서 DB에는 방향의 개념이 없다. 그러나 객체의 경우, 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있으므로 방향의 개념이 존재한다. 객체 관계에서 한 쪽만 반대쪽을 참조하는 관계를 단방향, 양 쪽 모두 서로를 참조하는 관계를 양방향이라고 한다. 3) 연관관계의 주인 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다. 데이터베.. 2022. 9. 21.
[JPA] Entity 연관관계 매핑 (연관관계의 주인) 패러다임의 불일치 '객체지향 프로그래밍' 은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 정치들을 제공한다. 이에 반해 '관계형 데이터베이스'는 추상화, 상속 다형성 같은 개념이 없다. 데이터 중심으로 구조화되어 있고 집합적인 사고가 필요하다. 이러한 객체와 관계형 데이터베이스의 패러다임 불일치 문제를 해결하는데 많은 시간과 코드가 소비된다. 연관관계 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 (참조로 연관된 객체를 조회) 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가진다. (join으로 연관된 테이블 조회) 객체를 테이블에 맞춰 모델링? 그럼 객체를, 테이블과 똑같이 모델링하면 어떻게 될까? 예시를 하나 들어본다. 데이터베이스에는 아래 그.. 2022. 9. 21.
[JPA] Entity 매핑 (필드와 칼럼 매핑, 기본키 매핑) 1. 객체와 테이블 매핑 @Entity가 붙은 클래스를 JPA가 entity로 관리한다. 여기에는 꼭 파라미터가 없는 생성자가 필수로 있어야 한다. 클래스를 이름이 다른 테이블과 매핑하고 싶다면 @Table안에 name 속성에 적어주면 되고, UNIQUE 조건은 uniqueConstrains에 적어주면 된다. 칼럼 수준에서도 unique 조건을 달아줄 수 있지만 생성되는 이름이 더 복잡해지고 여러 칼럼에 unique 조건을 걸어줄 수 없기 때문에 @Table로 하는 방식을 권장한다. 이 기능은 DDL자동생성시에만 적용된다. @Entity // JPA가 인식 @Table(name = "table_member", uniqueConstraints={ @UniqueConstraint(columnNames={"c.. 2022. 9. 21.
[JPA] JPA의 구동방식, 영속성 컨텍스트 (영속성 컨텍스트의 장점) 1. JPA의 구동방식 JPA의 구동방식을 살펴보면 아래와 같이 META-INF라는 곳 아래에 persistence.xml을 설정정보로 참고한 뒤 EntityManagerFactory를 생성하고 거기서 EntityManager를 생성해서 요청을 실행한다. EntityManagerFactory와 EntityManager? 어플리케이션은 단 하나의 EntityManagerFactory를 가지는데, 어플리케이션이 실행하면 생성하고 종료하면 소멸한다. 실제 DB 사용을 담당하는 EntityManager는 하나의 Thread(Transaction)가 생성될 때마다 EntityManagerFactory가 생성해 준다. 이를 코드로 구현하면 다음과 같다. public class JpaMain { public stat.. 2022. 9. 20.
[JAVA] @Builder 동작 원리, @Builder.Default, @Singular 1. @Builder 란 @Builder 란 Lombok에서 제공하는 어노테이션으로, 생성자 인자를 메서드 체인을 통해 명시적으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성 해준다. 빌더 클래스와 IDE의 자동 완성 기능을 같이 활용하면 생성자 작성 시 오기입 확률과 인자를 누락할 확률을 낮출 수 있다. API Javadoc의 설명: If a class is annotated, then a private constructor is generated with all fields as arguments (as if @AllArgsConstructor(access = AccessLevel.PRIVATE) is present on the class), and it is as if this constr.. 2022. 9. 16.
[Java] 불변 객체, final을 사용해야 하는 이유 (Immutable Object) 1. 불변 객체란? 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체이다. 불변 객체는 read-only 메소드만을 제공하며, 객체의 내부 상태를 제공하는 메소드를 제공하지 않거나 방어적 복사(defensive-copy)를 통해 제공한다. Java의 대표적인 불변 객체로는 String이 있다. 아래 코드를 보자. String name = "One"; name.toCharArray()[2] = 'g'; Java의 String은 불변 클래스이기 때문에 위와 같이 String 내부의 char형 배열을 얻어 수정하여도 반영이 되지 않는다. Java에서는 배열이나 객체 등의 참조(Reference)를 전달한다. 그렇기 때문에 참조를 통해 값을 수정하면 내부의 상태가 변하기 때문에 내부를 복사하여 전달하.. 2022. 9. 16.
[Java] Final 의미, 사용법, final 키워드에 대한 이해 Java에서는 불변성을 확보할 수 있도록 final 키워드를 제공하고 있다. 클래스나 변수에 final을 붙이면 처음 정의된 상태가 변하지 않는 것을 보장한다는 의미이다. Java에서 변수들은 기본적으로 가변적인데, 변수에 final 키워드를 붙여 참조값을 변경 못하도록 해 불변성을 확보할 수 있다. 이 Final 키워드가 사용되는 4가지 경우를 정리해보자면 다음과 같다. 1. final 변수 다음과 같이 변수를 선언할 때 클래스 앞에 final 키워드 final String hello = "Hello world"; final 키워드가 붙은 변수는 초기화 후 변경할 수 없다. 다음과 같이 변경하려고 하면 컴파일 에러가 발생한다. final String hello = "Hello world"; hello .. 2022. 9. 16.
[Springboot] ResponseEntity란? Spring에서는 HTTP Response 를 만드는 것이 주요한 관심사다. 200, 404 등 각각의 응답의 상태 코드뿐만 아니라, Body 에 들어갈 내용도 넣어 주어야 한다. 이 세 가지 요소를 채운 객체를 만드는 것, 즉 이 데이터를 받아서 자동으로 구성해주는 것이 바로 @ResponseBody 와 ResponseEntity다. ​ @ResponseBody 우선 @ResponseBody는 HTTP 규격에 맞는 응답을 만들어주기 위한 Annotation 이다. HTTP 요청을 객체로 변환하거나, 객체를 응답으로 변환하는 HttpMessageConverter를 사용한다. 스프링부트 @RequestBody와 @ReponseBody Annotation을 추가하는 것으로 간단하게 처리를 할 수 있다는 점이.. 2022. 9. 16.
Builder Pattern 빌더 패턴의 특징, 장점 (@Builder 사용이유, @Builder 예제) entity나 Dto객체에 값을 넣어줄때, 롬복의 빌더 애노테이션(@Builder)을 사용하는 예제들이 많다. 객체를 생성하기 위해서는 생성자 패턴, 자바빈 패턴, 빌더 패턴 등을 사용할 수 있는데, 이 빌더 패턴을 쓰는 이유가 무엇일까? ​ 우선 빌더 패턴이란 디자인패턴중 하나로, 생성과 표현의 분리다. 클래스를 설계하다보면 필수로 받야할 인자들이 있고 선택적으로 받야할 인자들이 있는데, 쉽게 말해 생성자에서 인자가 많을때 고려해 볼수있는것이 바로 이 빌더패턴이다. 왜 그런 것인지 다른 패턴들과 함께 비교해보자. ​ Telescoping Constructor Pattern 점층적 생성자 패턴 각 생성자를 오버로딩 해서 만드는 기초적인 방식이다. 필수적으로 값이 있어야할 멤버변수를 위해 생성자에 매개변수.. 2022. 9. 16.
728x90