티스토리 뷰
반응형
// 라이브러리들을 받아올 원격 저장소 결정
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에 값을 설정하는
- 생성자를 통해서 최종값을 넣은 다음 DB에 Insert(삽입)한다.
- 값 변경이 필요한 경우 해당 이벤트에 맞는 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
링크
TAG
- graphql
- java
- go 특징
- string
- github
- Basic Type
- 주생성자
- Squash and merge
- 코틀린
- hashcode
- git
- DGS Framework
- Kotlin
- Python
- python3
- 2차 인터뷰
- 코딩테스트
- Kotlin In Action
- postman tests
- postman collection
- downTo
- pm.expect
- 네이버 2022 공채
- squash merge
- mysql
- pm.test
- 1차 인터뷰
- postman
- solidity
- 확장 함수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함