반응형
Domain Package
Memo.java
package com.sparta.week03.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@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();
}
}
MemoRepository
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();
// Timestamped의 ModifiedAt 을 가져온다.
// find All By Order By ModifiedAt at Desc
}
MemoRequestDto
package com.sparta.week03.domain;
import lombok.Getter;
@Getter
public class MemoRequestDto {
private String username;
private String contents;
}
Timestamped
package com.sparta.week03.domain;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass // Entity가 자동으로 컬럼으로 인식.
// Timestamped class를 상속한 것이 자동으로 생성시간, 수정시간을 컬럼으로 잡도록 도와줌
@EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트함.
@Getter // 조회를 위함
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
Service Package
Service - Update를 위함
package com.sparta.week03.service;
import com.sparta.week03.domain.Memo;
import com.sparta.week03.domain.MemoRepository;
import com.sparta.week03.domain.MemoRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@RequiredArgsConstructor
@Service
public class MemoService {
// 반드시 필요하기에 final 선언
private final MemoRepository memoRepository;
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
// new NullPointerException() 도 된다.
);
memo.update(requestDto);
return memo.getId();
}
}
Controller Package
MemoController
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;
@PostMapping("/api/memos")
// RequestBody를 사용해야 요청이 올 때 Body의 내용을 Dto에 넣어줌.
public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
return memoRepository.save(memo);
}
@GetMapping("/api/memos")
public List<Memo> getMemos() {
return memoRepository.findAllByOrderByModifiedAtDesc();
}
@DeleteMapping("/api/memos/{id}")
public Long deleteMemo(@PathVariable Long id) {
memoRepository.deleteById(id);
return id;
}
@PutMapping("/api/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto){
memoService.update(id, requestDto);
return id;
}
}
Week03Application
package com.sparta.week03;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@EnableJpaAuditing // 내용이 바뀌었을 때 자동으로 Spring이 반영하도록 함
@SpringBootApplication
public class Week03Application {
public static void main(String[] args) {
SpringApplication.run(Week03Application.class, args);
}
}
패키지 구성
+ 24시간 이내의 타임라인만 가져오기
- 위의 링크를 참조하여 수정한다.
반응형
'스프링 (Spring) > Timeline Project' 카테고리의 다른 글
메모 변경하기 - submitEdit 함수 (0) | 2021.07.20 |
---|---|
메모 조회하기 - GetMessage 함수 (0) | 2021.07.20 |
메모 생성하기 - WritePost 함수 생성 (0) | 2021.07.20 |
클라이언트 설계, 구성 (0) | 2021.07.20 |
타임라인 프로젝트 계획 (0) | 2021.07.19 |
댓글