
기본 패키지 아래에 (저의 경우 com.suhyeokeeee.tistory.crud)
domain이라는 디렉토리(패키지)를 만들고 또 domain패키지 안에 post 패키지를 만들어주세요
그 후 post패키지 안에 Posts 라는 클래스를 만들어주세요.
꼭 기본패키지 아래에 있어야 합니다. 맨 처음 프로젝트를 생성했을 때 기본적으로 있는
~~~~ Application이라는 class 파일이 있을 텐데(저의 경우 CrudApplication) (저는 이니셜 라이저로 만들어서 자동 생성됐는데 없으신 분들은 만드시면 됩니다.)

여기에 붙어있는 @SpringBootApplication 이 어노테이션 하나로 컴포넌트 스캔을 진행하게 됩니다.
즉 기본패키지 아래에 만들지 않으면 컴포넌트 스캔 대상이 되지 않습니다.
domain 디렉토리에는 엔티티와 관련된 것들이 들어갈 디렉토리입니다.
엔티티란? DB 테이블과 자바 클래스가 매핑이 되는 것입니다. 여기선 자바 클래스가 되겠죠?
이번 게시글의 경우 게시글 + 댓글까지 구현할 것이라 디렉토리
domain-post / domain-comment 이런 식으로 나눠지게 될 것입니다.
자자 정리하자면 domain = 엔티티와 관련된 것이 들어가고 그리고 또 거기서
게시글 폴더 따로, 댓글 폴더 따로 관리해주신다고 생각하시면 됩니다.
@NoArgsConstructor : Lombok의 어노테이션으로 디폴트 생성자를 만들어 줍니다. 왜 필요한지는 밑에서 설명하겠습니다.
@Getter : Lombok의 어노테이션으로 객체 내 모든 필드에(변수나 객체) getter 메서드를 자동으로 만들어 줍니다.
코드량이 줄어든다는 장점이 있습니다.
@Entity : 실제로 이 객체가 DB 테이블과 매핑이 된 다는 것을 뜻 합니다.
자세한 설명은 https://suhyeokeee.tistory.com/category/Spring%20Data%20JPA
'Spring Data JPA' 카테고리의 글 목록
제가 공부한 것을 복기 하기위해, 기록하기 위해 있는 블로그로 전문성이 많이 떨어지는 블로그입니다.
suhyeokeee.tistory.com
이 카테고리를 참고하시길 바랍니다.
@Id : 데이터 베이스에 있는 pk값입니다
@GeneratedValue : DB에 값을 집어넣을 때 id값을 개발자가 따로 집어넣지 않아도 자동적으로 값이 올라갑니다
defalut option은 auto이며
첫 번째 게시글을 쓸 경우 id = 1
두 번째 게시글을 쓸 경우 id = 2
이렇게 자동적으로 숫자가 증가해서 들어갑니다.
@Builder : 빌더 패턴을 지원해주는 어노테이션입니다.
빌더 패턴에 대한 자세한 설명은
https://lemontia.tistory.com/483 이곳을 참고하길 바랍니다.
@Column : DB에 매핑되는 컬럼입니다. 기본적으로 @Entity 어노테이션이 붙어있으면 생략해도 자동으로 테이블의 컬럼으로 매핑이 됩니다.
하지만 Column안에 들어있는 nullable=false를 사용하기 위해서 선언했습니다.
nullable=false가 붙어있는 컬럼들은 값을 쓰지 않고 제출할 수 없습니다.
즉, 빈칸으로 제출 할 수 없습니다.

같은 폴더 안에 이번엔 '인터페이스'로 PostsRepository를 만들어주세요
그리고 JpaRepository를 extends 해주세요
JpaRepository <Posts, Long> 여기서 Posts, Long에 무엇이 들어가는지에 대해 설명하겠습니다
실제 코드를 작성하시고 JpaRepository에 마우스 커서를 대고 컨트롤+왼쪽 클릭을 하면 JpaRepository로 이동할 수 있습니다.

대충 여러 개의 메서드가 정의돼 있는데 처음 하신다면 이 모든 걸 모르셔도 됩니다 겁먹지 마세요 ~~
public interface JpaRepository <T, ID> 이렇게 있는데 여기서 T는 제네릭입니다.
즉 어떠한 데이터 타입도 들어갈 수 있다는 뜻입니다.
그래서 JpaRepository <a, b>에 대해서 설명해 드리면
a위치에는 DB와 매핑할 엔티티가 들어갑니다.
이미 위에서 Posts라는 엔티티를 만들었으니 a 자리에는 Posts가 들어갑니다.
b 자리에는 id의 타입이 들어갑니다.
@Id @GenerateValue
private Long id;
라고 작성한 거 기억나시죠? id를 Long타입으로 지정했으니 b 자리에는 Long이 들어갑니다.
이렇게 하면 우리는 아무것도 안 해도 기본적인 crud 메서드를 사용할 수 있습니다
Q:아니 저희가 만든 repository는 인터페이스이고 저희는 아무것도 구현을 안 했는데 어떻게 메소드를
사용할 수 있나요? 인터페이스는 단순히 메소드만 정의 해 놓은 것이 아닌가요?
A : 스프링 부트가 알아서 구현체를 만들어 줍니다. 정말 편하죠?
자세한 원리
https://suhyeokeee.tistory.com/97?category=865156
06 JPA 프로그래밍 - 스프링 Data JPA 원리
스프링 데이터 JPA 원리 public interface PostsRepository extends JpaRepository { } Repository를 하나 만듦으로 인해 자동적으로 CRUD 메소드가 지원이 된다. 그럼 이러한 인터페이스는 어..
suhyeokeee.tistory.com
여기서 PostsRepository가 생성될 때 제네릭 안에 있는 (<Posts, Long>) 여기서 Posts 클래스의 기본 생성자가 필요합니다. 없으면 생성이 되지 않습니다.
그래서 아까 Posts 클래스를 작성할 때 롬복의 기본 애노테이션 @NoArgsConstructor를 사용한 것입니다.
이렇게 엔티티 설정까지 완료하였습니다.
다음 시간에는 service , controller, 그리고 db에 데이터를 save 하는 과정까지 해보겠습니다.