@Entity
이 클래스가 엔티티 클래스임을 나타내는 애노테이션이다.
디비에 연결 할 수 있도록 엔티티 클래스를 설정해 놓는 것이 좋다.
@Getter과 @Setter는 lombok을 사용해서 자동으로 getter와 setter 메서드를 생성하도록 지정하는 애노테이션이다.
Data를 굳이 안쓰고 왜 getter랑 setter를 적었는지는 아래에서 설명하겠다.
@EqualsAndHashCode(of = "id")
@EqualsAndHashCode
equals()와 hashCode() 메서드를 생성하도록 지정하는 애노테이션이다.
여기서 of 속성으로 "id"를 지정하면, id 필드만 사용해서 equals()와 hashCode()를 생성하게 된다.
순환 참조, 그리고 무한루프 때문에 id만 사용하는 것이 좋다.
@Builder, @AllArgsConstructor, @NoArgsConstructor
lombok을 사용해서 빌더 패턴, 모든 필드를 인자로 받는 생성자, 기본 생성자를 자동으로 생성하도록 지정하는 애노테이션이다.
여기서 빌더를 사용하는 이유는
data 어노테이션은 Java 16부터 추가된 새로운 키워드로, 클래스에 대한 불필요한 반복적인 작업을 줄이기 위해 사용할 수 있는 기능이다.
data 키워드를 사용하면 자동으로 생성자, 게터(getter), 세터(setter), equals(), hashCode(), toString() 메소드가 생성되어 편리하게 사용할 수 있는데,
빌더 패턴은 인스턴스 생성 시 필요한 매개변수가 많은 경우, 매개변수의 순서를 기억하지 않아도 되고, 일부 매개변수만 설정할 수 있는 유연성을 제공하여 객체 생성을 보다 간편하게 만들 수 있다.
따라서 매개변수가 많거나 유연한 객체 생성이 필요한 경우에는 빌더 패턴을 사용하는 것이 좋다.
빌더 패턴이 조금 낯설 수 있는데 정처기를 공부한 자로써 빌더는 디자인 패턴 중 하나이다.
디자인 패턴
소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 일종의 해결책을 제시하는 것이다.
즉, 이미 해결된 문제들에 대한 솔루션을 일종의 틀(패턴)로 정리해 둔 것
디자인 패턴을 사용하면 장점이 있다.
개발 과정에서 발생할 수 있는 문제를 예방할 수 있다.
소프트웨어의 구조가 개선되어 유지보수가 용이해진다.
개발자들 간의 소통이 원활해진다.
디자인 패턴은 크게 구조,생성,행위 패턴으로 나누어지는데
생성 패턴
객체의 생성에 관련된 패턴입니다. 객체를 생성, 합성하는 방법과 객체의 표현 방법을 다룹니다.
Singleton 패턴 : 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하는 패턴
Factory Method 패턴 : 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 만들지에 대한 결정은 서브 클래스가 내리도록 한다.
Abstract Factory 패턴 : 인터페이스를 이용하여 서로 연관되거나 의존하는 객체들을 구체화 클래스를 지정하지 않고도 생성할 수 있는 패턴
구조 패턴
객체의 구성 방법과 관련된 패턴입니다. 클래스나 객체를 조합해 더 큰 구조를 만드는 것에 중점을 둡니다.
Adapter 패턴 : 호환되지 않는 인터페이스 때문에 함께 동작할 수 없는 클래스들을 연결하여 같이 동작할 수 있게 해주는 패턴
Composite 패턴 : 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층 구조를 만드는 패턴
Facade 패턴 : 복잡한 서브 시스템을 단순화시키는 인터페이스를 제공하는 패턴
행위 패턴
객체나 클래스 사이의 알고리즘이나 책임 분배와 관련된 패턴입니다. 객체들이 상호작용을 하는 방법과 책임을 분배하는 방법에 중점을 둡니다.
Observer 패턴 : 객체 사이의 일대다 의존 관계를 정의해 놓아, 어떤 객체의 상태가 변할 때 그 객체에 의존하는 다른 객체들에게 자동으로 알림을 보내는 패턴입니다. 주로 GUI, 이벤트 처리, 모니터링 시스템 등에서 활용됩니다.
Strategy 패턴 : 동일한 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고, 이들이 필요할 때 교체할 수 있도록 함으로써, 동일한 문제를 다른 알고리즘으로 해결할 수 있도록 하는 패턴입니다. 주로 알고리즘 변경에 따른 유연한 대처가 필요한 경우에 활용됩니다.
Template Method 패턴 : 알고리즘의 구조는 그대로 유지하되, 특정 단계에서 수행하는 내용을 서브 클래스에서 오버라이드하여 변경할 수 있게 하는 패턴입니다. 주로 상속을 통해 기능을 확장할 수 있는 구조에서 활용됩니다.
Command 패턴 : 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 하는 패턴입니다. 주로 요청의 이력을 관리하거나 요청을 처리하는 구조에서 활용됩니다.
그 외에도 다양한 행위 패턴이 존재한다
그리하여 매개변수가 많아질수록 코드의 가독성이 떨어지고 유지보수성이 나빠질 가능성이 높아진다.
따라서 가능하면 많은 매개변수를 가지는 대신 데이터 객체를 사용하여 한번에 전달하도록 하는 것이 좋은데 데이터 객체를 사용하면 매개변수를 줄이고 코드의 가독성을 높일 수 있으며, 변경 사항이 발생할 경우 데이터 객체만 수정하면 되므로 유지보수성도 향상되어진다.
@Id @GeneratedValue
private Long id;
//아이디를 두 방향으로 쓰겠다!
@Column(unique = true)
private String email;
@Column(unique = true)
private String nickname;
@Id와 @GeneratedValue 어노테이션해당 엔티티의 Primary Key (주키)를 정의하는 역할을 한다.
@Id는 해당 변수가 엔티티의 주키임을 나타내며, @GeneratedValue는 해당 주키를 자동으로 생성한다는 의미인데.
주키를 자동으로 생성하기 위해 여러 전략들이 있으며, 이 코드에서는 기본값으로 GenerationType.IDENTITY를 사용한다.
@Column은 해당 변수가 데이터베이스의 컬럼임을 나타내며, 속성값으로 unique = true를 설정하여 해당 컬럼이 고유(unique)한 값을 가져야 한다는 것을 명시하고 있다. 위의 코드에서는 email과 nickname이라는 두 개의 컬럼을 정의하고 있는데
이 중 email과 nickname은 모두 고유한 값을 가져야 한다는 의미이다.
@Lob //텍스트 타입의 매핑
@Basic(fetch = FetchType.EAGER)
private String profileImage;
@Lob
데이터베이스에 큰 크기의 객체를 저장할 때 사용하는 어노테이션이다.
@Basic
객체-관계 매핑에서 필드에 대한 기본 설정을 할 때 사용한다.
fetch
FetchType.EAGER 는 즉시 로딩을 의미하는데, 이를 통해 프로필 이미지도 함께 조회할 수 있다.
즉, 해당 코드는 프로필 이미지를 데이터베이스에 텍스트 형태로 저장하며, EAGER 로딩을 통해 즉시 조회할 수 있도록 설정한 것이다.
'java > JPA' 카테고리의 다른 글
JPA- JPQL(Java Persistence Query Language) (0) | 2023.04.11 |
---|---|
JPA 양방향 연관관계 매핑 (0) | 2023.04.10 |
JPA 객체 관계 맵핑과 다양한 연관 관계 (0) | 2023.04.10 |
JPA EntityMapping 테이블 만들어보기 (0) | 2023.04.07 |
JPA PersistenceContext, EntityManagerFactory, EntityManager (0) | 2023.04.07 |