서버 설계

서버 완성하기 - CRUD 기능을 가진 API 만들기

키워드 : RestController, Service, Repository, RequestDto

0. API 설계

1. Repository 만들기

- domain 패키지 & 클래스 만들기

@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();
  }
  //update 기능
  public void update(MemoRequestDto requestDto) {
    this.username = requestDto.getUsername();
    this.contents = requestDto.getContents();
  }

}

- Timestamped 상속

@Getter
@MappedSuperclass // Entity가 자동으로 컬럼으로 인식합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트합니다.
public class Timestamped {
  @CreatedDate
  private LocalDateTime createdAt;
  
  @LastModifiedDate
  private LocalDateTime modifiedAt;
}

- Repository 인터페이스 만들기

public interface MemoRepository extends JpaRepository<Memo, Long> {
  // List<Memo> findAllByOrderByModifiedAtDesc();
  // findAllBy OrderBy ModifiedAt Desc
  // ModifiedAy(수정된시간)을 기준으로 Desc(내림차순)으로 OrderBy(순서대로)로 List를 정렬
}

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

- RequestDto 클래스 만들기

@Getter
public class MemoRequestDto {
  private String username;
  private String contents;
}

2. Service 만들기

- service 패키지 & Service 클래스

@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();
  }
}

3. Controller 만들기

- controller 패키지 & Controller 클래스

@RequiredArgsConstructor
@RestController
public class MemoController {
  private final MemoRepository memoRepository;
  private final MemoService memoService;
  
  // create 
  @PostMapping("/api/memos")
    public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
    Memo memo = new Memo(requestDto);
    return memoRepository.save(memo);
  }
  
  // read
  @GetMapping("/api/memos")
  public List<Memo> getMemos() {
    return memoRepository.findAllByOrderByModifiedAtDesc();
  }
  // delete
  @DeleteMapping("/api/memos/{id}")
  public Long deleteMemo(@PathVariable Long id) {
    memoRepository.deleteById(id);
    return id;
  }
  // update
  @PutMapping("/api/memos/{id}")
  public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
    memoService.update(id, requestDto);
    return id;
  }

}

좋은 웹페이지 즐겨찾기