카테고리 없음

Q&A 게시판 [Spring Boot + JPA + MariaDB] - 게시글 등록(register)

VvsJaemin 2021. 3. 24. 23:48

개발환경

IDEA: VScode
Java:11
Gradle 6.8.3
Spring Boot 2.4.4

 

Q&A 게시판을 만들어 보려고 한다.

 

 - 코딩 과정 게시글 등록(Register) - > 게시판 리스트(list) -> 게시글 읽기(read) -> 게시글 수정(modify) -> 게시글 삭제(delete) 순으로 진행예정

 

[패키지명 구성]

- 패키지명 구성은 qbs(Q&A BoardService) 약자로 아래 Controller - domain - Repository - service 순으로 했으며, cmm은 공통 컴포넌트로 필요 시 사용 예정이다. 

 

[코딩 순서]

domain -> repository -> service -> controller

 

 

 

 

 

[domain - Entity]

- Entity는 DB테이블과 mapping되는 객체

- @Builder는 setter 대신 사용

- @Table 어노테이션으로 DB테이블 이름 지정, 없는 경우 클래스 이름으로 자동 mapping

 

[DTO]

- DTO 클래스를 생성하여 Controller와 Service 사이에서 데이터를 주고 받도록 한다.

  Service를 주입 받아서 사용한다. 

- 직렬화를 통해 Object 또는 Data를 외부의 자바 시스템에서도 사용 할 수 있도록 바이트 단위로 데이터 변환하여 파일 또는 네트워크를 통해 스트림(송수신)이 가능하도록 함.

- toEntity()는 DTO에서 필요한 부분을 builder pattern을 통해 entity로 만드는 역할

[Repository]

- Repository는 데이터의 변경을 담당하는 interface로 생성하며, JpaRepository를 인터페이스를 사용하기 위해 JpaRepository상속받음

JpaRepository의 값은 mapping할 entitiy와 id의 타입이다.

- @Query에 column , 추상메서드와 value에는 속성 값을 작성한다.

 

- @Query 어노테이션을 직접 작성에 대한 장점은

 1) 복잡한 JPQL을 해결할 수 있다. 

 2) 애플리케이션 로딩 시점에 문법 오류를 발견할 수 있다.

 

- JpaRepository를 상속받아 아래와 같이 JPQL @Query 어노테이션 부여 후 쿼리 직접 정의 

 

- 기본적으로 JpaRepository가 제공하는 메서드들은 모두 트랜잭션 처리가 되어 있으며 제공하는 메서드 사용 시

 

따로 메서드를 만들 필요는 없다

 

그렇지만 비교를 위해 게시글 등록 부분은 커스텀했기 때문에 트랜잭션처리(@Transactional)를 해줘야 500 에러가 발생되지 않음

 

-트랜잭션 처리를 한 Repository를 사용해서 데이터를 가져오면 그 객체는 persistent 상태 즉, 영속성 컨텍스트에서 관리하는 객체가 된다. 

 

 

[JPQL]

JPQL(Java Persistence Query Language) 는 JPA (Java Persistence API) 의 일부로 정의된 플랫폼 독립적인 객체지향 쿼리 언어

 

JPQL 은 관계형 데이터베이스의 Entity에 대한 쿼리를 만드는데 사용

 

SQL 에 크게 영향을 받아 SQL 문과 비슷하지만 데이터베이스의 테이블에 직접 연결되는 것이 아니라 JPA 엔티티에 대해 동작

 

그래서 JPQL 의 쿼리에는 테이블이 아닌 엔티티에서 표현하고 있는 컬럼의 이름 써야한다.

 

[Service]

- 작성한 Repository를 이용하여 Service를 구현. Service는 실제로 비즈니스 로직을 시행하는 역할

- DTO를 통해 Service의 register에서 Repository에 데이터를 집어 넣는다.  

- @AllArgsConstructor는 필드값을 모두 포함한 생성자를 자동 생성 <-> @NoArgsConstructor는 기본생성자를 자동 생성

JpaRepository 사용시
Custom
Jpa 사용 시

 

[controller]

- @RequiredArgsConstructor는 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용

- @RestController(controller + responsebody)는 Spring MVC Controller에 @ResponseBody가 추가된 것. 당연하게도 RestController의 주 용도는 Json 형태로 객체 데이터를 반환.

- ResponseEntity는 HttpEntity를 상속받음으로써 HttpHeader와 body를 가질 수 있다.

 

Jpa
Custom

반응형