Spring 기초 3주차

Doyoon Lee·2021년 8월 17일
0

Spring

목록 보기
3/7

아키텍쳐

  • 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 넣기

0개의 댓글