Q&A 게시판 [Spring Boot + JPA + MariaDB] - 게시글 등록(register)
개발환경
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는 기본생성자를 자동 생성
[controller]
- @RequiredArgsConstructor는 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용
- @RestController(controller + responsebody)는 Spring MVC Controller에 @ResponseBody가 추가된 것. 당연하게도 RestController의 주 용도는 Json 형태로 객체 데이터를 반환.
- ResponseEntity는 HttpEntity를 상속받음으로써 HttpHeader와 body를 가질 수 있다.