Spring 기초 3주차
아키텍쳐
- Controller - Service - Repository의 3계층 존재
Repository 만들기
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 공식 홈페이지에 잘 나와있다.
Service 만들기
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(); } }
Controller 만들기
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 넣기
Author And Source
이 문제에 관하여(Spring 기초 3주차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@idoburnish/Spring-기초-3주차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)