티스토리 뷰

반응형

 

// 라이브러리들을 받아올 원격 저장소 결정
dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-data-jpa') // 추가
    compile('com.h2database:h2') // 추가
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

build.gradle의 dependencies에 위에 주석으로 표시한 부분( // 추가 )을 추가하였다.

 

spring-boot-starter-data-jpa

  • 스프링 부트용 Spring Data JPA 추상화 라이브러리
  • 스프링 부트 버전에 맞춰 자동으로 JPA 관련 라이브러리들의 버전을 관리

h2

  • 인메모리 관계형 데이터베이스
  • 별도의 설치 없이 프로젝트 의존성만으로 관리
  • 재시작할 때마다 초기화되기 때문에 테스트 용도로 많이 사용

 

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class Posts {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

실제 DB와 매칭될 클래스이고, Entity 클래스라고도 한다.

 

@Entity

  • 테이블과 링크될 클래스임을 표시
  • 파스칼 표기법으로 작성된 클래스 이름(HelloWorld)을 스네이크 표기법(hello_world)로 테이블 이름을 매칭 

@Id

  • 해당 필드의 PK 필드를 표시

@GeneratedValue

  • PK의 생성 규칙

@Column

  • 테이블의 칼럼을 표시
  • 선언 되지 않아도 클래스의 필드는 모두 칼럼이 된다
  • 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용
    • VAR(255)가 기본값인 문자열의 사이즈를 변경하고 싶을 때
    • 타입을 변경하고 싶을 때

@Getter

  • 클래스 내 모든 필드의 Getter 메소드를 자동생성

@NoArgsConstructor

  • 파라미터가 없는 기본 생성자 자동 추가

@Builder

  • 해당 클래스의 빌더 패턴 클래스를 생성
  • 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
💡 주요 어노테이션을 클래스에 가깝게

롬복은 필수 어노테이션이 아닌 코드를 단순화 시키기 위해서 사용하는 것이다. 필수적이지 않은 어노테이션을 클래스 바깥에 둘수록, 코틀린 등의 새로운 언어로 전환을 하고 롬복이 더 필요없을 경우 삭제가 쉬워진다.
💡 Setter 메소드가 없다

getter/setter를 무작정 생성하면 클래스의 인스턴스 값들이 변하는 곳을 코드상에서 명확하게 구분할 수 없다.
따라서 Entity 클래스에서는 절대 Setter 메소드를 만들지 않는다. 대신 필드 값을 변경할 때 목적과 의도를 나타낼 수 있는 메소드를 추가해주면 된다.
// 잘못된 예
public class Order {
	public void setStatus(boolean status) {
    	this.status = status;
    }
}

public void 주문서비스의_취소이벤트() {
	order.setStatus(false);
}
// 올바른 예
public class Order {
	public void setStatus() {
    	this.status = false;
    }
}

public void 주문서비스의_취소이벤트() {
	order.cancelOrder();
}

위의 코드를 비교하면 목적과 의도를 나타낼 수 있는 메소드의 의미를 알 수 있다. 단순히 setter를 사용해서 값을 false로 만들기 보다는, cancelOrder라는 메소드를 사용하고 있다.

 

Setter가 없는 상황에서 DB에 값을 설정하는

  1. 생성자를 통해서 최종값을 넣은 다음 DB에 Insert(삽입)한다.
  2. 값 변경이 필요한 경우 해당 이벤트에 맞는 public 메소드를 호출하여 변경한다.

위에 있는 Posts 클래스는 @Builder를 통해 제공되는 빌더 클래스를 사용하여 setter의 생성자의 역할을 대신한다.

 

import org.springframework.data.jpa.repository.JpaRepository;

public interface PostsRepository extends JpaRepository<Posts, Long> {
    
}

위의 코드는 Posts 클래스로 Database를 접근하게 해줄 JpaRepository 인터페이스이다.

 

JpaRepository<Entity 클래스, PK 타입> 을 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다.

Entity 클래스와 기본 Entity Repository는 함께 위치(같은 패키지 안에)해야 한다. Entity 클래스는 기본 Repository 없이는 제대로 역할을 할 수가 없다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함