package com.example.demo.dto;
import com.example.demo.domain.Notice;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
public class NoticeDto {
// Notice를 create, update, delete 등을 할 때 다양하게 사용하므로 클래스 안에 클래스로 선언했다. (static으로 선언)
@Builder
@Getter
@Setter
public static class CreateReqDto{
private String title;
private String content;
public Notice toEntity(){
Notice notice = new Notice();
notice.setTitle(getTitle());
notice.setContent(getContent());
return notice;
}
}
@Getter
@Setter
public static class CreateResDto{
private Long id;
}
}
: 이 클래스는 클라이언트에서 공지사항을 생성할 때 보내는 데이터를 담는다.
: 이 메서드는 CreateReqDto 객체를 Notice 엔티티로 변환해주는 역할을 한다.
: 공지사항 생성 후, 서버가 클라이언트에 응답할 때 사용하는 DTO이다.
: NoticeDto.CreateResDto의 Return Type을 가진 toCreateResDto 메소드를 선언한다. (이는 엔티티에서의 id 값만 return 해주기 위함이다.)
package com.example.demo.domain;
import com.example.demo.dto.NoticeDto;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@Entity
public class Notice {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
@Id
Long id; // primary key
@Column(nullable = false)
String title; // 공지 제목
@Column(nullable = false)
String content; // 공지 내용
Integer readCount; // 공지 읽은 횟수
public NoticeDto.CreateResDto toCreateResDto(){
NoticeDto.CreateResDto dto = new NoticeDto.CreateResDto();
dto.setId(id);
return dto;
}
}
: Return Type과 Param Type을 NoticeDto의 CreateResDto, CreateReqDto로 수정해준다.
package com.example.demo.service;
import com.example.demo.domain.Notice;
import com.example.demo.dto.NoticeDto;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public interface NoticeService {
NoticeDto.CreateResDto create(NoticeDto.CreateReqDto params);
Notice update(Map<String, Object> params);
List<Notice> list();
Notice detail(Long id);
Notice delete(Long id);
}
@Override
public NoticeDto.CreateResDto create(NoticeDto.CreateReqDto params) {
Notice notice = params.toEntity(); // 1. CreateReqDto를 Notice 엔티티로 변환
notice = noticeRepository.save(notice); // 2. 변환된 Notice 객체를 데이터베이스에 저장
NoticeDto.CreateResDto resDto = notice.toCreateResDto(); // 3. 저장된 Notice 객체를 CreateResDto로 변환
return resDto; // 4. 변환된 응답 DTO 반환
}
: 이 코드는 더 간결한 표현이다. 위에서 설명한 첫 번째 코드의 모든 과정을 한 줄로 축약한 형태라고 볼 수 있다.
@Override
public NoticeDto.CreateResDto create(NoticeDto.CreateReqDto params) {
return noticeRepository.save(params.toEntity()).toCreateResDto();
}
: Return Type을 NoticeDto.CreateResDto로, Param의 Type을 NoticeDto.CreateReqDto로 수정해준다.
: 추가적으로 Dto를 사용하게 되면 @RequestBody로 지정해주어야 한다.
: GetMapping -> PostMapping으로 수정한다.
@CrossOrigin(origins = "http://localhost:3000")
@PostMapping({"/create"})
public NoticeDto.CreateResDto create(@RequestBody NoticeDto.CreateReqDto params) {
// @RequestParam 를 삭제한 이유?
return noticeService.create(params);
}
function create_notice(){
const data1 = JSON.stringify({
title : $("#create_notice_title").val(),
content : $("#create_notice_content").val(),
})
$.ajax({
url : "/api/notice/create",
type : "POST",
contentType : 'application/json; charset=utf-8',
data : data1,
cache : false,
success : (obj_data, status, xhr) => {
alert(JSON.stringify(obj_data));
$("#create_notice_title").val("");
$("#create_notice_content").val("");
},
error: (obj_data, status, error) => {
alert("error!!");
alert(JSON.stringify(obj_data));
}
})
}