Lombok(롬복) & JPA 에 대한 간단한 설명, 기본 애너테이션(@) 몇 가지
Lombok(롬복)
자바로 코딩을 할 때 가장 힘든 부분 중 하나는, 변수를 선언하고 나서 다음과 같은 것들을 일일이 만들어줘야 한다는 것이다.
- 기본 생성자
- 모든 매개변수가 들어간 생성자
- 각 변수마다 get, set 메서드
- 기타 ...
(get, set 메서드의 경우 IntelliJ가 자동으로 만들어주긴 하지만, 생성자의 경우 IntelliJ가 기본으로 만들어주지 않는다.)
이떼 롬복의 어노테이션을 이용하면 get, set 메서드 등을 기본으로 설정해주기 때문에 위와 같은 수고를 쉽게 덜 수 있다.
@Data
자동으로 기본 생성자와 get, set메소드를 만들어주며, equals, hashCode, toString 등도 롬복이 재정의 해준다.
@AllArgsConstructor
모든 매개변수를 가진 생성자를 추가해주는 애너테이션이다.
JPA (Java Persistent API)
JPA는 ORM(Object Relational Mapping)으로 RDB 데이터베이스의 정보를 객체지향으로 손쉽게 활용할 수 있도록 도와주는 라이브러리이다. Object(자바 객체)와 Relation(관계형 데이터베이스) 둘의 매핑을 통해서 보다 손쉽게 적용할 수 있는 기술을 제공해준다. 개발자가 쿼리에 집중하기 보다 객체에 집중함으로써 조금 더 프로그래밍적으로 많이 활용할 수 있게 해준다.
롬복에는 JPA와 관련된 애너테이션을 다양하게 제공한다. 이를 이용하면 매우 편하게 코딩을 할 수 있으므로 요즘은 거의 필수로 쓰인다. 아래는 JPA와 관련된 기본적인 롬복 애너테이션 몇 가지이다. 참고로 JPA에는 테이블을 자동으로 생성해주는 기능도 존재한다.
Annotation | 용도 | 비고 |
@Entity | 해당 Class가 Entity임을 명시 | JPA의 Entity는 DB의 Table과 동일하다고 생각하면 된다. |
@Table | 실제 DB Table의 이름을 명시 | 실제 DB 테이블의 이름과 동일하다면 굳이 선언하지 않아도 자동 매핑이 된다. |
@Id | Index primary key를 명시 | |
@Column | 실제 DB Column의 이름을 명시 | 선언한 변수명과 실제 DB 컬럼의 이름과 동일하다면 굳이 선언하지 않아도 자동 매핑이 된다. |
@GeneratedValue | Primary key 식별키의 전략 설정 | AUTO, IDENTITY, SEQUENCE, TABLE이라는 네 가지 옵션이 있다. MySQL을 사용하는 경우 IDENTITY로 설정하면 된다. |
이때, Java에서 변수를 선언할 때는 Camel Case(카멜 케이스)로 선언하지만, DB 컬럼이나 API 통신 규격에서는 주로 Snake Case(스네이크 케이스)를 많이 사용한다. 따라서 실제 DB 테이블명/컬럼명과 동일하다는 의미는 Java에서는 카멜 케이스로 선언한 것과 DB에서는 스네이크 케이스로 선언한 것이 같으면 된다는 의미이다.
아래는 JPA 롬복 어노테이션을 활용한 코드 예시이다.
import javax.persistence.*;
import java.time.LocalDateTime;
@Data // 기본 생성자와 변수에 대해 get, set 메서드 생성
@AllArgsConstructor // 모든 매개변수를 가진 생성자도 추가
@NoArgsConstructor // 파라미터가 없는 생성자 생성
@Entity // Entity임을 선언 (= table)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String account;
private String password;
private String email;
private String phoneNumber;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
private LocalDateTime createdAt;
private String createdBy;
private LocalDateTime updatedAt;
private String updatedBy;
}
선언한 변수명과 실제 DB의 테이블명/컬럼명이 동일하므로 아래와 같이 @Table, @Column 애너테이션으로 매칭시켜주지 않아고 자동 매핑이 된다. (Java 클래스의 경우 Upper Camel Case를 이용한다.)
@Table(name = "user") // 굳이 선언하지 않아도 자동 매핑 시켜줌
public class User {
@Column(name = "account") // 굳이 선언하지 않아도 자동 매핑 시켜줌
private String account;
}
@Repository
따로 쿼리문을 작성하지 않아도 기본적인 인터페이스를 통해 CRUD를 사용할 수 있다. 사용법은 간단하다. 인터페이스를 하나 생성한 후 @Repository 애너테이션을 달아준 후, 이미 개발되어있는 JpaRepository를 상속받으면 된다.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface Repository명 extends JpaRepository<T, ID> {
}
[Generic Parameters]
T: 어떠한 타입의 오브젝트 클래스가 들어갈 것인지 제네릭으로 넘겨주면 된다.
ID: 기본키(Primary key)로 어떤 타입이 들어가있는지를 넘겨주면 된다.
위에 작성해 놓은 User Class를 기반으로 아래의 UserRepository를 만들어 보았다.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
// User라는 레파지토리, 기본키인 id가 Long이므로
public interface UserRepository extends JpaRepository<User, Long> {
}
User 클래스의 기본키가 id이고 이는 Long 타입이므로 제네릭으로 받는 두 번째 파라미터에는 Long을 입력하면 된다. 이렇게만 해도 기본적인 CRUD를 할 수 있는 환경이 마련된 것이다.
CRUD의 구체적인 실현 방법은 아래 링크를 통해 확인할 수 있다.
(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)
'Java' 카테고리의 다른 글
JPA 연관관계 설정 (@OneToOne/@OneToMany/@ManyToOne/@ManyToMany) (0) | 2022.02.25 |
---|---|
JpaRepository를 활용한 CRUD 구현 방법 (자세한 설명) (0) | 2022.02.24 |
[Spring Boot] Post 메소드 사용법 (@PostMapping) (0) | 2022.02.23 |
[Spring Boot] Get 메소드 사용법 (@RequestMapping, @GetMapping, 멀티 파라미터, JSON 리턴) (0) | 2022.02.23 |
[Java] Stream이란? 간단한 설명 (0) | 2022.02.13 |