JPA를 활용하여, DB에 데이터를 생성하기
- DB는 JAVA언어를 모릅니다.
- DB는 SQL이라는 언어를 사용합니다.(따라서 JAVA를 이해하지못합니다.)
- 그래서 이를 위한 도구가 JPA입니다.
- 자바언어를 DB가 이해할 수 있게 할 뿐만아니라 데이터 관리에 편리한 기능을 제공합니다.
- 핵심 도구로는 Entity,Repository가있습니다.
- Entity는 자바 객체를 DB가 이해할수 있게 잘 규격화된 데이터입니다.
- 이런 Entity는 레파지토리라는 일꾼을 통해서 DB에게 전달되고 처리됩니다.(DB속 테이블에 관리되는 겁니다.)
DTO를 Entity로 변환하고 Repository를 통해 DB까지 하는 과정을 확인해 보겠습니다.
1.처리 흐름 개요
- 두가지 단계가 필요하다고 배웠습니다.
- 1.DTO를 변환해야 합니다! Entity로 바꿔야 합니다.
- 2.DB에 저장해야 하는데 그 DB에 저장하는 것이 Repository입니다.
(Repository에게 Entity를 DB안에 저장하게 해야합니다.)
2. Entity로 변환
- form 데이터를 Entity로 변환하는 코드
Article article = form.toEntity();
2-1 Entity작성
- Article클래스를 entity라는 새로운 패키지에 생성
- Dto에서 받았던 필드를 같이 적습니다.
- DB에서 인식을 할 수 있게 해주려면 @Entity를 붙여주어야 합니다.
(DB가 해당 객체를 인식 가능하게합니다.)
- 필드인 title과 content도 DB에서 이해할 수 있게 @Column이라고 붙여줘야합니다.
(DB에서 관리하는 테이블이라는 단위의 연결되게 만들어 주는 겁니다.)
- 추가로 기본적으로 엔티티에는 대표값을 하나 넣어 줘야합니다.(사람으로 따지면 주민등록번호)
- 제목도 같고,내용도 같은게 있을 수는 있지만 그것들을 정확하게 구분 짓기 위한 대표 값을 보통id라고 짓습니다.( @Id라는 어노테이션을 붙여줍니다.)
- 보통 ID는 자동생성에서 많이 쓰이는데 자동생성하기 위한 어노테이션 @GeneratedValue를 사용하면 1,2,3..이렇게 자동생성에 대해 주는 어노테이션입니다.
- Entity를 만들기 위해서 이제 생성자를 추가 해줘야 합니다.
- toString메서드 까지 작성을 해줍니다.
- 이제 ArticleController의 Article은 오류가 지워졌고 form에서 toEntity메서드로 Dto인 폼에서 Entity객체로 변환하는 메서드를 추가
2-2변환 메서드 추가
- dto패키지의 ArticleForm클래스로 이동하여 toEntity라는 메서드를 만들겠습니다.
- toEntity메서드는 Article타입을 반환하기 때문에 return값을 article을 리턴해주는데 새롭게 Article을 만들어서 리턴해줍니다.
- 하지만 Article은 Entity클래스의 객체를 생성해야 하니까 생성자로 호출해야 합니다.해당 생성자는 id,title,content를 입력받고 있으니까 요구에 맞게 작성합니다.
(id값은 null,title,content은 그대로)
- 이제 다시 컨트롤러로 가면 모든 오류가 사라집니다.
- 이렇게 해서 Dto를 Entity로 변하는 과정이 끝났습니다.
3. 데이터 저장하기
- Repository가 있다는 가정하에 코드를 작성해 봅니다.
Article saved = articleRepository.save(article);
- 이제 articleRepsotiry 객체가 없기 때문에 에러가 나기때문에 이 객체를 사용하기 위해 필드에 AriticleRepository를 선언해줍니다.
3-1 Repository 작성
- 기본패키지에 controller,dto,entity 패키지와 동일한 선상에 repository라는 패키지를 생성합니다.
- 패키지 안에 interface를 만들어 줍니다. ArticleRepository라고 만들어 줍니다.
- Repository를 직접 구현할 수도 있지만 JPA에서 제공하는 interface를 활용해서 쉽게 만들어 줄수 있습니다.
- CrudRepository라는 인터페이스를 상속받아옵니다.
- 이러면 CrudRepository가 제공하고 있는 기능들을 정의없이 그대로 사용할 수가 있습니다.
- CruedRepository에 2개의 파라미터를 넣어줘야합니다.
- 앞에는 관리대상 Entity를 넣어줘야합니다. 두번쨰는 관리 대상 Entity에서 대표값의 타입을 넣어주어야 합니다.
-
이렇게 하면 Article을 CRUD 즉 생성하고 읽고 수정하고 삭제하는 기본 동작을 추가 코드 구현 없이 확장받아서 사용할 수 있게 됩니다.
-
추가로, 하나 해주어야 할 것이 있습니다. ArticleRepository 객체를 만든적이 없습니다.
원래 자바언어를 배운 사람이라면
ArticleRepository articleRepository = new ArticleRepository();
- 하지만 객체를 따로 만들지 않아도 됩니다. 왜냐하면 스프링 부트에서는 자체적으로 알아서 해주기 때문입니다.
3-2 객체 주입하기(DI)
-
@Autowired 어노테이션을 만들어 주면 스프링 부트가 미리 생성해 놓은 객체를 가져다가 자동으로 연결시켜줍니다.
-
dto가 Entity로 잘 변환 됬는지, article이 save가 잘되었는지 출력해보겠습니다.
4. 데이터 저장 확인
- 처음에는 Dto가 담겨졌고, 이제 Entity로 변환하였고, 이 article을 save시켰더니 saved라는 변수에 결과가 반환되었습니다. (id값이 자동으로 생성)