ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #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

    1. 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();
          }
      }​
       
    2. 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;
          }
      }​
    3. 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 어노테이션
     

    @Transactional 어노테이션

    @Transactional 어노테이션 : 이 어노테이션 선언 시 스프링에서 트랜잭션 처리를 지원(선언적 트랜잭션) 트랜잭션? 데이터베이스의 논리적인 작업의 단위로 데이터베이스의 상태를 변경하는 작업

    leeeehhjj.tistory.com

     

    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
Designed by Tistory.