찔끔찔끔씩😎

[웹개발의 봄, Spring] 3주차 (1) - 타임라인 서비스 서버 완성하기 본문

Server/Spring

[웹개발의 봄, Spring] 3주차 (1) - 타임라인 서비스 서버 완성하기

댕경 2022. 3. 16. 18:04
728x90

API 설계하기

🔎 API 설계

기능 Method URL Return
메모 생성하기 POST /api/memos Memo
메모 조회하기 GET /api/memos List<Memo>
메모 변경하기 PUT /api/memos/{id} Long
메모 삭제하기 DELETE /api/memos/{id} Long

 

🔎 Repository 만들기

1. 프로젝트에 domain 패키지 만들기

2. Memo 클래스 만들기
- 메모는 1) username, 2) contents로 이루어짐

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

   - username은 메모를 생성할 때 자동으로 주어지는 익명의 id임
   - Timestamped 클래스를 생성해서 상속 받기

@MappedSuperclass // Entity가 자동으로 컬럼으로 인식합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트합니다.
public abstract class Timestamped { // abstract: 상속을 받아야만 할 수 있는 것

    @CreatedDate //생성시간
    private LocalDateTime createdAt;

    @LastModifiedDate //마지막수정시간
    private LocalDateTime modifiedAt;
}

3. MemoRepository 인터페이스 만들기
- JpaRepsitory를 상속받고 ID가 Long 타입인 MemoRepository를 생성

public interface MemoRepository extends JpaRepository<Memo, Long> {
   //JpaRepository 상속, Memo라는 녀석의 id가 Long인 녀석
    List<Memo> findAllByOrderByModifiedAtDesc(); // 생성시간 최신순을 정렬해주셈
}

4. MemoRequestDto 클래스 만들기

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

 

🔎 Service 만들기

  1. 프로젝트에 service 패키지 만들기
  2. MemoService 클래스 만들기
    - Annotation으로 Service임을 명시
    - MemoRepository를 멤버 변수로, 꼭 필요함을 명시함 (final) + @RequiredArgsConstructor 

   3. MemoService 클래스에 update 기능 추가하기
   - id와 requestDto을 받아서 해당 메모를 수정하고 id를 반환하는 메소드

@RequiredArgsConstructor //final 이랑 생성된 애 있으면, 세트~
@Service // Service라는 것도 알려주기
public class MemoService {

    private final MemoRepository memoRepository;

    @Transactional // update 할때 DB에 반영이 꼭 돼야해!
    public Long update(Long id, MemoRequestDto requestDto) { //메모의 id와 변결시킬 메모
        Memo memo = memoRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
        );
        memo.update(requestDto);
        return memo.getId();
    }
}

 

   4. Memo 클래스에 update 메소드 추가하기

public void update(MemoRequestDto requestDto){
    this.username = requestDto.getUsername();
    this.contents = requestDto.getContents();
}

 

🔎 Controller 만들기

  1. 프로젝트에 controller 패키지 만들기
  2. MemoController 클래스 만들기
  3. url 매핑을 통해 CRUD 메소드 작성하기

@RequiredArgsConstructor
@RestController
public class MemoController {

    private final MemoRepository memoRepository;
    private final MemoService memoService;

    @PostMapping("/api/memos")
    public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
        // @RequestBody : 요청이 오면, Body에 쓰여진 애를 Dto에 넣어줘! 라는 annotation
        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){
        return memoService.update(id, requestDto);
    }


}

주의할 점

- Annotation으로 RestController 임을 명시해야 한다.

- C,R,D 를 위해 MemoRepository를 멤버변수로 가져야 한다.

- U 를 위해 MemoService를 멤버변수로 가져야 한다. 

 

 

Comments