-
#1 조별 일지 기록 페이지SOLUX-우리만 앱 2021. 7. 5. 17:23
조별로 회의 기록을 작성하고 수정할 수 있는 페이지
패키지
- Domain : 게시글, 댓글, 회원, 결제 등 소프트웨어에 대한 요구사항 혹은 문제 영역 / 비즈니스 처리 담당
- DTO : 계층 간에 데이터 교환을 위한 객체(Data Transfer Object)
- Service : 트랜잭션, 도메인 간 순서 보장 / Controller와 Dao의 중간 영역에서 사용
- Repository : 데이터 저장소에 접근하는 영역, Dao 영역
1. Post 클래스
import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; @Getter @NoArgsConstructor @Entity //jpa 어노테이션 public class Post extends BaseTimeEntity{ //db 테이블과 매칭될 클래스 @Id //primary key @GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment(기본 키의 자동 증가) private Long id; @Column(length = 500, nullable = false) private String title; @Column(columnDefinition = "TEXT", nullable = false) private String content; private String author; private int teamNumber; @Builder public Post(String title, String content, String author, int teamNumber) { this.title = title; this.content = content; this.author = author; this.teamNumber = teamNumber; } public void update(String title, String content) { this.title = title; this.content = content; } }
- @Getter : 롬복 어노테이션으로 자동으로 getter 생성
- @NoArgsConstructor : 롬복 어노테이션으로 기본 생성자 생성
- @Entity : JPA의 어노테이션으로 DB 테이블과 매칭될 클래스임을 나타냄
- @Id : 테이블의 PK(PRIMARY KEY) 필드
- @GeneratedValue : PK 생성 규칙 나타냄. (GenerationType.IDENTITY) 주면 id 값이 자동으로 1, 2 이런식으로 순서대로 부여됨
- @Column : 테이블의 칼럼임을 나타내며 굳이 선언하지 않아도 되지만 변경이 필요한 옵션이 있을 경우에만 선언
2. PostRepository
import org.springframework.data.jpa.repository.JpaRepository; public interface PostRepository extends JpaRepository<Post, Long> { //dao // 게시글 save, findAll 등의 역할 수행 }
- Dao 영역의 클래스로 JpaRepository 상속하는 인터페이스로 생성
- JpaRepository가 기본 CRUD(create, read, update, delete) 메소드 자동 생성
- entity 클래스와 함께 위치해야 함
* Spring Data JPA
- CRUD 처리를 위한 인터페이스 제공
- Repository 구현 시 구현체가 없이 인터페이스만 작성해도 실행 시점에 spring data JPA가 자동으로 구현 객체 생성해서 주입해줌
3. Dto
- PostSaveRequestDto(등록)
import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import solux.woodong.web.domain.posts.Post; @Getter @NoArgsConstructor public class PostSaveRequestDto { private String title; private String content; private String author; private int teamNumber; @Builder public PostSaveRequestDto(String title, String content, String author, int teamNumber) { this.title = title; this.content = content; this.author = author; this.teamNumber = teamNumber; } public Post toEntity() { return Post.builder() .title(title) .content(content) .author(author) .teamNumber(teamNumber) .build(); } }
- PostUpdateRequestDto(수정)
import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @NoArgsConstructor public class PostUpdateRequestDto { private String title; private String content; @Builder public PostUpdateRequestDto(String title, String content) { this.title = title; this.content = content; } }
- PostResponseDto(조회)
import lombok.Getter; import solux.woodong.web.domain.posts.Post; @Getter public class PostResponseDto { private Long id; private String title; private String content; private String author; private int teamNumber; public PostResponseDto(Post entity) { this.id = entity.getId(); this.title = entity.getTitle(); this.content = entity.getContent(); this.author = entity.getAuthor(); this.teamNumber = entity.getTeamNumber(); } }
4. Service
import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import solux.woodong.web.domain.posts.Post; import solux.woodong.web.domain.posts.PostRepository; import solux.woodong.web.dto.post.PostResponseDto; import solux.woodong.web.dto.post.PostSaveRequestDto; import solux.woodong.web.dto.post.PostUpdateRequestDto; @RequiredArgsConstructor //생성자를 생성하여 이를 통해 스프링 bean을 주입 (스프링 컨테이너에 있는 postservice에 postrepository 연결) @Service public class PostService { private final PostRepository postRepository; @Transactional public Long save(PostSaveRequestDto requestDto) { return postRepository.save(requestDto.toEntity()).getId(); } @Transactional public Long update(Long id, PostUpdateRequestDto requestDto) { Post post = postRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id=" + id)); post.update(requestDto.getTitle(), requestDto.getContent()); return id; } public PostResponseDto findById (Long id) { Post entity = postRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id="+id)); return new PostResponseDto(entity); } }
- @RequiredArgsConstructor : final이 선언된 모든 필드를 파라미터로 하는 생성자를 만들어줌 -> 이를 통해 PostRepository 객체를 PostService 생성자에 넣어주는 방식으로 스프링 bean을 주입 받음 = @AutoWired와 같은 효과 / 스프링 컨테이너에 있는 postRepository에 postService를 연결해줌
- @Transactional : 2021.07.01 - [스프링] - @Transactional 어노테이션
5. Controller
import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import solux.woodong.web.dto.post.PostResponseDto; import solux.woodong.web.dto.post.PostSaveRequestDto; import solux.woodong.web.dto.post.PostUpdateRequestDto; import solux.woodong.web.service.post.PostService; @RequiredArgsConstructor //생성자를 통해 bean 주입(스프링 컨테이너에 있는 postService를 controller에 연결시켜줌) @RestController //controller는 view를 반환하기 위해 쓰는 것이고 restcontroller는 controller + responseBody로 json 데이터 반환 public class PostApiController { private final PostService postService; @PostMapping("/api/v1/post") public Long save(@RequestBody PostSaveRequestDto requestDto) { return postService.save(requestDto); } @PutMapping("/api/v1/post/{id}") public Long update(@PathVariable Long id, @RequestBody PostUpdateRequestDto requestDto) { return postService.update(id, requestDto); } @GetMapping("/api/v1/post/{id}") public PostResponseDto findById (@PathVariable Long id) { return postService.findById(id); } }
- @RestController : @Controller + @ResponseBody로 Json 데이터를 반환해 줌
- @Controller : 데이터가 아닌 view를 반환해줌
- @RequestBody : 클라이언트에서 서버로 json데이터를 담아 보내면 서버에서 requestBody를 이용해 이를 자바 객체로 변환시켜 저장
- @ResponseBody : 서버에서 클라이언트로 응답 데이터를 전송하기 위해 responseBody를 사용하여 자바 객체를 json으로 변환하여 전송
- @PathVariable : "api/v1/post/{id}"에서 {id}로 들어오는 값을 사용하겠다는 의미
- @RequestParam : "api/v1/post?num=1과 같이 들어오는 값을 사용하겠다는 의미
참고 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스(저자 - 이동욱)
'SOLUX-우리만 앱' 카테고리의 다른 글
Postman Unsupported Media Type 에러 (0) 2021.08.06 #2 ERD (0) 2021.07.13 JPA란? (0) 2021.07.05 @Transactional 어노테이션 (0) 2021.07.01 Get과 Post 방식 차이점 (0) 2021.06.30