Memo.java
@NoArgsConstructor // 기본생성자를 만듭니다. @Getter @Entity // 테이블과 연계됨을 스프링에게 알려줍니다. public class Memo extends Timestamped { // 생성,수정 시간을 자동으로 만들어줍니다. @GeneratedValue(strategy = GenerationType.AUTO) @Id 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(); } }
Timestamped.java
@MappedSuperclass // Entity가 자동으로 컬럼으로 인식합니다. @EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트합니다. public class Timestamped { @CreatedDate private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime modifiedAt; } - @MappedSuperclass: Timestamped를 상속한 것이 자동으로 생성 시간과 수정 시간을 컬럼(Column),으로 잡도록 도와준다. - @EntityListeners: Entity(Memo class)가 변화하는 것을 항상 지켜보고 있다가, 변화가 일어나면(AuditingEntityListener) 자동으로 생성시간/수정시간을 업데이트 해준다는 뜻이다. - @CreatedDate: 생성시간 - @LastModifiedDate: 수정시간
MemoRepository.java
public interface MemoRepository extends JpaRepository<Memo, Long> { List<Memo> findAllByOrderByModifiedAtDesc(); }
- findAllByOrderByModifiedAtDesc()은 modifiedAt이라는 변수를 최신순으로 정렬해서 다 보여준다는 뜻이다.
- 이와 같이 JPA 사용법에 대한 내용은 JPA 공식 홈페이지에 잘 나와있다.
MemoService.java
@RequiredArgsConstructor @Service public class MemoService { private final MemoRepository memoRepository; @Transactional public Long update(Long id, MemoRequestDto requestDto) { Memo memo = memoRepository.findById(id).orElseThrow( () -> new IllegalArgumentException("아이디가 존재하지 않습니다.") ); memo.update(requestDto); return memo.getId(); } }
- final을 통해 memoRepository가 꼭 필요함을 알린다.
- @Service를 통해 해당 클래스가 service임을 알린다.
- @Transactinal을 통해 service에서의 변경사항을 DB에 반영되게 한다.
Memo.java 업데이트
@NoArgsConstructor // 기본생성자를 만듭니다. @Getter @Entity // 테이블과 연계됨을 스프링에게 알려줍니다. public class Memo extends Timestamped { // 생성,수정 시간을 자동으로 만들어줍니다. @GeneratedValue(strategy = GenerationType.AUTO) @Id 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(); } public void update(MemoRequestDto requestDto) { this.username = requestDto.getUsername(); this.contents = requestDto.getContents(); } }
MemoController.java
@RequiredArgsConstructor @RestController public class MemoController { private final MemoRepository memoRepository; private final MemoService memoService; @PostMapping("/api/memos") public Memo createMemo(@RequestBody MemoRequestDto requestDto){ Memo memo = new Memo(requestDto); return memoRepository.save(memo); } @GetMapping("/api/memos") public List<Memo> readMemo(){ return memoRepository.findAllByOrderByModifiedAtDesc(); } @PutMapping("/api/memos/{id}") public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto){ memoService.update(id, requestDto); return id; } @DeleteMapping("/api/memos/{id}") public Long deleteMemo(@PathVariable Long id){ memoRepository.deleteById(id); return id; } }
cf) Timestamped에 @Getter 넣기 + 메인코드에 @EnableJpaAuditing 넣기