메소드, 생성자 등을 자동생성해준다.
클래스 위에 @NoArgsConstructor(기본 생성자), @Getter 같은 annotation을 붙여 사용한다.
데이터를 다룰 때, 클래스를 건드리는 것을 막아주는 완충재 역할을 한다.
package com.sparta.week02.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Getter
public class CourseRequestDto {
private String title;
private String tutor;
public CourseRequestDto(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
api는 클라이언트와 서버 간의 약속
주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러내는 것
Repository - Service - Controller 순서로 작성.
(안쪽부터 바깥쪽으로!!)
기능 - Method - URL - Return
메모 생성하기 - POST - /api/memos - Memo
메모 조회하기 - GET - /api/memos - List< Memo >
메모 변경하기 - PUT - /api/memos/{id} - Long
메모 삭제하기 - DELETE - /api/memos/{id} - Long
return값이 Long인 이유 : 메모들을 구분하는 유일한 정보인 id값(long타입)만을 가져오면 되기 때문
package com.sparta.week03.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Getter
@NoArgsConstructor // 기본생성자 만들기
@Entity // 테이블과 연계됨을 스프링에게 알려줌
public class Memo extends Timestamped{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String contents;
public Memo(String username, String contents) {
this.username = username;
this.contents = contents;
}
public Memo(MemoRequestDto requestDto) {
this.username = requestDto.getUsername();
this.contents = requestDto.getContents();
}
}
@MappedSuperclass // Entity가 자동으로 컬럼으로 인식합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트합니다.
public class Timestamped {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
package com.sparta.week03.domain;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface MemoRepository extends JpaRepository<Memo, Long> {
List<Memo> findAllByOrderByModifiedAtDesc();
}
package com.sparta.week03.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
@Getter
@NoArgsConstructor // 기본생성자 만들기
public class MemoRequestDto {
private String username;
private String contents;
}
package com.sparta.week03.service;
import com.sparta.week03.domain.Memo;
import com.sparta.week03.domain.MemoRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@RequiredArgsConstructor
@Service
public class MemoService {
private final MemoRepository memoRepository;
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo person1 = MemoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
person1.update(requestDto);
return person1.getId();
}
}
Memo.java에 update메소드 추가하기
public void update(MemoRequestDto requestDto) {
this.username = requestDto.getUsername();
this.contents = requestDto.getContents();
}
package com.sparta.week03.controller;
import com.sparta.week03.domain.Memo;
import com.sparta.week03.domain.MemoRepository;
import com.sparta.week03.domain.MemoRequestDto;
import com.sparta.week03.service.MemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RequiredArgsConstructor
@RestController
public class MemoController {
private final MemoRepository memoRepository;
private final MemoService memoService;
// Read
@GetMapping("/api/memos")
public List<Memo> getMemos() {
return memoRepository.findAllByOrderByModifiedAtDesc();
}
// Create
@PostMapping("/api/memos")
public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
return memoRepository.save(memo);
}
// Update
@PutMapping("/api/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
memoService.update(id,requestDto);
return id;
}
// Delete
@DeleteMapping("/api/memos/{id}")
public Long deleteMemo(@PathVariable Long id) {
memoRepository.deleteById(id);
return id;
}
}