피드백 내용
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
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();
}
}