[Practice] 공지사항 게시판 목록에 대한 요청 API 만들기 (9)

2021. 4. 12. 15:41Spring/Practice

1. 문제

  • REST API 형식으로 구현
  • HTTP METHOD는 POST
  • 요청 주소는 "/api/notice"
  • 전달되는 파라미터는 application/json 형식의 제목, 내용을 입력 받음
  • 전달된 값을 저장하기 위한 JPA Repository와 Entity를 통해 데이터베이스에 저장
  • 리턴값은 저장된 id값이 포함된 Entity 리턴

 

 

 

2. 풀이

- 패키지 구조

config
ㄴㅡ SecurityConfig

notice
ㄴㅡ controller
    ㄴㅡ ApiNoticeController
    
ㄴㅡ entity
    ㄴㅡ Notice
    
ㄴㅡ model
    ㄴㅡ NoticeModel -> NoticeInput
    
ㄴㅡ repository
    ㄴㅡ NoticeRepository

-  application.yml

spring:
  h2:
    console:
      enabled: true
      path: /h2-console

  datasource:
    url: jdbc:h2:mem:backofficeDb
    driver-class-name: org.h2.Driver
    username: root
    password: '1111'

  jpa:
    hibernate:
      ddl-auto: create-drop # none

    generate-ddl: true # false

    properties:
      format_sql: true
      hibernate:
        show-sql: true

  mvc:
    hiddenmethod:
      filter:
        enabled: true

  mustache:
    suffix: .html

logging:
  level:
    org.hibernate.SQL: trace
    org.hibernate.type: trace

- Notice.java

package com.example.jpa.sample.notice.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Data
public class Notice {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String title;

    @Column
    private String contents;

    @Column
    private LocalDateTime regDate;
}

- NoticeRepository.java

package com.example.jpa.sample.notice.repository;

import com.example.jpa.sample.notice.entity.Notice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface NoticeRepository extends JpaRepository<Notice, Long> {

}

- NoticeModel -> NoticeInput.java

package com.example.jpa.sample.notice.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor // 모든 필드의 생성자
@NoArgsConstructor // 기본 생성자
@Builder // 빌더 패턴
@Data // Getter, Setter
public class NoticeInput {
    
    private String title;
    private String contents;
}

- ApiNoticeController.java

package com.example.jpa.sample.notice.controller;

import com.example.jpa.sample.notice.entity.Notice;
import com.example.jpa.sample.notice.model.NoticeInput;
import com.example.jpa.sample.notice.repository.NoticeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@RequiredArgsConstructor
@RestController
public class ApiNoticeController {

    private final NoticeRepository noticeRepository;

    /*
    // 문제 6
    @GetMapping("/api/notice")
    public String noticeString() {
        return "공지사항입니다.";
    }
     */

    /*
    // 문제 7
    @GetMapping("/api/notice")
    public NoticeModel notice() {

        LocalDateTime regDate = LocalDateTime.of(2021, 1, 1, 0, 0);

        NoticeModel notice = new NoticeModel();
        notice.setId(1);;
        notice.setTitle("공지사항입니다.");
        notice.setContents("공지사항 내용입니다.");
        notice.setRegDate(regDate);

        return notice;
    }
     */

    /*
    // 문제 8
    @GetMapping("/api/notice")
    public List<NoticeModel> notice() {

        List<NoticeModel> noticeList = new ArrayList<>();

        noticeList.add(NoticeModel.builder()
                .id(1)
                .title("공지사항입니다.")
                .contents("공지사항 내용입니다.")
                .regDate(LocalDateTime.of(2021, 1, 1, 0, 0))
                .build()
        );
        noticeList.add(NoticeModel.builder()
                .id(2)
                .title("두번째 공지사항입니다.")
                .contents("두번째 공지사항 내용입니다.")
                .regDate(LocalDateTime.of(2021, 1, 2, 0, 0))
                .build()
        );

        return noticeList;
    }
     */

    // 문제 9
    @GetMapping("/api/notice")
    public List<NoticeInput> notice() {

        List<NoticeInput> noticeList = new ArrayList<>();

//        return null;
        return noticeList;
    }

    // 문제 10
    @GetMapping("/api/notice/count")
    public int noticeCount() {
//        return "10";
        return 10;
    }

    /*
    // 문제 11
    @PostMapping("/api/notice")
    public NoticeModel addNotice(@RequestParam String title, @RequestParam String contents) {

        NoticeModel notice = NoticeModel.builder()
                .id(1)
                .title(title)
                .contents(contents)
                .regDate(LocalDateTime.now())
                .build();

        return notice;
    }
     */

    /*
    // 문제 12
    @PostMapping("/api/notice")
    public NoticeModel addNotice(NoticeModel noticeModel) {

        noticeModel.setId(2);
        noticeModel.setRegDate(LocalDateTime.now());

        return noticeModel;
    }
     */

    /*
    // 문제 13
    @PostMapping("/api/notice")
    public NoticeModel addNotice(@RequestBody NoticeModel noticeModel) {

        noticeModel.setId(3);
        noticeModel.setRegDate(LocalDateTime.now());

        return noticeModel;
    }
     */

    // 문제 14
    @PostMapping("/api/notice")
    public Notice addNotice(@RequestBody NoticeInput noticeInput) {

        Notice notice = Notice.builder()
                .title(noticeInput.getTitle())
                .contents(noticeInput.getContents())
                .regDate(LocalDateTime.now())
                .build();

        return noticeRepository.save(notice);
    }
}

728x90