Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- AWS
- yolov5
- CRUD
- 솝트
- 서류전형
- Python
- 면접전형
- 파이썬 #백준 #BFS
- spring-boot
- 멋쟁이사자처럼
- 피로그래밍
- Java
- 합격후기
- objectdetection
- nodejs
- S3
- 백준
- MongoDB
- 카카오
- EC2
- 인공지능
- 절차지향
- 솝트 후기
- 페이지네이션
- 파이썬
- jQuery
- jwt
- 프로그래머스
- 멋사
- 사물인식
Archives
- Today
- Total
찔끔찔끔씩😎
[웹개발의 봄, Spring] 3주차 (1) - 타임라인 서비스 서버 완성하기 본문
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 만들기
- 프로젝트에 service 패키지 만들기
- 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 만들기
- 프로젝트에 controller 패키지 만들기
- MemoController 클래스 만들기
- 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를 멤버변수로 가져야 한다.
'Server > Spring' 카테고리의 다른 글
[웹개발의 봄, Spring] 3주차 (3) - 타임라인 서비스 클라이언트 완성하기 (0) | 2022.03.22 |
---|---|
[웹개발의 봄, Spring] 3주차 (2) - javascript, jQuery 기초 (0) | 2022.03.19 |
[웹개발의 봄, Spring] 2주차 (3) - API, Lombok, DTO (0) | 2022.03.13 |
[웹개발의 봄, Spring] 2주차 (2) - JPA, Repository (0) | 2022.03.11 |
[웹개발의 봄, Spring] 2주차 (1) - RDBMS, H2, SQL (0) | 2022.03.11 |
Comments