[기초 API 구현] - 피드백을 바탕으로 재구현

박성규·2022년 5월 25일
0

[스프링 부트]

목록 보기
19/38
post-thumbnail

피드백 내용
1. 메소드 명칭을 Camel 형식으로 통일할 것
ex) postwrite ==> postWrite

2.프론트와 데이터를 주고 받을때 뷰와 모델을 반환하기 보다는 json으로 반환할 것

3.Optional의 존재 이유에 대해 한번 더 생각해볼 필요가 있다.
Optional은 null이 포함가능한 객체이다. 그렇기에 단순히 get()만 사용해서 불러올꺼면 사용의 이유가 없다. 그렇기에 꼭 Nullexception을 활용할것

4.Entity 자체를 @RequestParam으로 받아버렸다. 매우 안좋은 구조.

5.처리가 잘 이루어 졌는지 상태에 대한 결과를 담는 변수를 선언해서 리턴하는 것 보다는 Http 통신 결과를 리턴할 수 있다.

부족했던 점
Post 처리가 완료 되었을 때 완료를 알리는 기능을 확실히 하지 못했다.
예를들어 게시글을 삭제 했을때 삭제가 완료되었다는 확실한 응답을 주지 못한다
5번에 해당하는 부분을 구현하면 가능할 것 같은데 아직 학습하지 못했다..

git 주소
https://github.com/ParkSungGyu1/spring-prac/tree/main/springapiprac

  1. Controller
package com.spring.springapiprac.controller;

import com.spring.springapiprac.dto.NoticeChangeDto;
import com.spring.springapiprac.dto.NoticeDeleteDto;
import com.spring.springapiprac.dto.NoticeDto;
import com.spring.springapiprac.dto.PasswordCheckDto;
import com.spring.springapiprac.model.Notice;
import com.spring.springapiprac.service.NoticeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class NoticeController {

    private final NoticeService noticeService;

    @Autowired
    public NoticeController(NoticeService noticeService){
        this.noticeService = noticeService;
    }

    //notice 전체 불러오기
    @GetMapping("/notice")
    public List<Notice> noticeView(){
        return noticeService.noticeView();
    }

    //게시글 디테일 확인
    //PathVariable 하는법  ==> /notice/detail/1
    @GetMapping("/notice/detail/{id}")
    public Notice detailView(@PathVariable Long id){
        return noticeService.detailView(id);
    }

    //RequestParam 하는법  ==> /notice/detail?id=1
    /*@GetMapping("/notice/detail")
    public Notice detailView(@RequestParam("id") Long id){
        return noticeService.detailView(id);
    }*/

    @PostMapping("/notice/detail/password")
    public boolean passwordCheck(@RequestBody PasswordCheckDto passwordCheckDto){
        PasswordCheckDto passwordCheckDto2 = noticeService.passwordCheck(passwordCheckDto);
        return passwordCheckDto2.isResult();
    }

    //게시글 수정
    @PutMapping("/notice/detail/change")
    public String noticeChange(@RequestBody NoticeChangeDto noticeChangeDto){
        noticeService.noticeChange(noticeChangeDto);
        return "1";
    }

    //게시글 삭제
    @DeleteMapping("/notice/detail/delete")
    public String noticeDelete(@RequestBody NoticeDeleteDto noticeDeleteDto){
        noticeService.noticeDelete(noticeDeleteDto);
        return "1";
    }

    //저장 기능 ==> 저장이 완료 되었을 때 Http 상태를 리턴하고 싶다.
    @PostMapping("/notice/write")
    public String noticeWrite(@RequestBody NoticeDto noticeDto){
        noticeService.noticeWrite(noticeDto);
        return "1";
    }


}

2.Service

package com.spring.springapiprac.service;

import com.spring.springapiprac.dto.NoticeChangeDto;
import com.spring.springapiprac.dto.NoticeDeleteDto;
import com.spring.springapiprac.dto.NoticeDto;
import com.spring.springapiprac.dto.PasswordCheckDto;
import com.spring.springapiprac.model.Notice;
import com.spring.springapiprac.repository.NoticeRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class NoticeService {

    private final NoticeRepository noticeRepository;

    public  NoticeService(NoticeRepository noticeRepository){
        this.noticeRepository = noticeRepository;
    }
    public List<Notice> noticeView() {
        return noticeRepository.findAll();
    }

    public Notice detailView(Long id) {
        Notice noticeDto = noticeRepository.findById(id)
                .orElseThrow(() -> new NullPointerException("해당 아이디가 존재하지 않습니다."));

        return noticeDto;
    }

    public void noticeWrite(NoticeDto noticeDto) {
        Notice notice = new Notice(noticeDto);
        noticeRepository.save(notice);
    }

    public PasswordCheckDto passwordCheck(PasswordCheckDto passwordCheckDto) {
        Notice noticeDto = noticeRepository.findById(passwordCheckDto.getId())
                .orElseThrow(() -> new NullPointerException("해당 아이디가 존재하지 않습니다."));
        if(noticeDto.getPassword().equals(passwordCheckDto.getPassword())){
            passwordCheckDto.setResult(true);
        }else{
            passwordCheckDto.setResult(false);
        }

        return passwordCheckDto;
    }

    public void noticeChange(NoticeChangeDto noticeChangeDto) {
        Notice notice = noticeRepository.findById(noticeChangeDto.getId())
                .orElseThrow(() -> new NullPointerException("해당 아이디가 존재하지 않습니다."));
        notice.setDescription(noticeChangeDto.getDescription());
        notice.setTitle(noticeChangeDto.getTitle());
        notice.setUsername(noticeChangeDto.getUsername());
        noticeRepository.save(notice);
    }

    public void noticeDelete(NoticeDeleteDto noticeDeleteDto) {
        noticeRepository.delete(noticeRepository.findById(noticeDeleteDto.getId()).orElseThrow(() -> new NullPointerException("해당 아이디가 존재하지 않습니다.")));
    }
}

3.Dto들

package com.spring.springapiprac.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class NoticeChangeDto {
    private Long id;
    private String username;
    private String title;
    private String description;
}
package com.spring.springapiprac.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class NoticeDeleteDto {
    private Long id;
}
package com.spring.springapiprac.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;


@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class NoticeDto {
    private String username;
    private String password;
    private String title;
    private String description;
}
package com.spring.springapiprac.dto;


import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class PasswordCheckDto {
    private Long id;
    private String password;
    private boolean result;
}

4.Entity

package com.spring.springapiprac.model;

import com.spring.springapiprac.dto.NoticeDto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

@Setter
@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Notice {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    // nullable: null 허용 여부
    // unique: 중복 허용 여부 (false 일때 중복 허용)
    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String description;

    public Notice(NoticeDto noticeDto) {
        this.username = noticeDto.getUsername();
        this.password = noticeDto.getPassword();
        this.title = noticeDto.getTitle();
        this.description = noticeDto.getDescription();

    }
}

0개의 댓글

관련 채용 정보