멋쟁이사자처럼 11기 백엔드 자바 Spring 실습 영상 중 챕터 5. CRUD & Data (2) 의 미션 해설 영상을 보고 내가 이해한 대로 정리하고자 한다.
@RequestMapping
구성을 할 수 있도록 합시다.post
와 board
의 관계가 요청하는 URL 상에 나타날 수 있도록 해봅시다.의존관계가 없는 Board를 먼저 구현한다!
public interface BoardRepository {
BoardDto create(BoardDto dto);
BoardDto read(Long id);
Collection<BoardDto> readAll();
boolean update(Long id, BoardDto dto);
boolean delete(Long id);
}
인터페이스를 통해 로직을 어느 정도 파악할 수 있다.
@Repository
public class InMemoryBoardRepository implements BoardRepository {
private Long lastIndex = 0L;
private final Map<Long, BoardDto> memory = new HashMap<>();
@Override
public BoardDto create(BoardDto dto) {
lastIndex++;
dto.setId(lastIndex);
memory.put(lastIndex, dto);
return memory.get(lastIndex);
}
@Override
public BoardDto read(Long id) {
return memory.getOrDefault(id, null);
}
@Override
public Collection<BoardDto> readAll() {
return memory.values();
}
@Override
public boolean update(Long id, BoardDto dto) {
if (memory.containsKey(id)) {
dto.setId(id);
memory.put(id, dto);
return true;
}
return false;
}
@Override
public boolean delete(Long id) {
if (memory.containsKey(id)) {
memory.remove(id);
return true;
}
return false;
}
}
@Repository
어노테이션을 붙인다.implements BoardRepository
를 작성한다.lastIndex
변수는 PK인 id를 위한 변수이다.memory
변수는 Long을 key로, BoardDto를 value로 갖는다. Long 형의 데이터 타입(PK)로 BoardDto를 조회하는 등의 행위를 함을 알 수 있다.구현된 메소드를 하나씩 살펴보자. (로직 자체는 그렇게 복잡하지 않지만 내가 Map을 사용하는 데에 익숙하지 않아서 문법 설명도 들어갈 수 있다.)
create : 인덱스 값을 증가시키고 들어온 dto의 id를 인덱스 값으로 준다. HashMap의 put 메소드로 저장한다. 인덱스 값으로 memory에서 dto를 가져와 리턴한다.
public V put(K key, V value)
key 값을 이용해 value를 넣는다.
read : Map의 getOrDefault 메소드를 이용해 BoardDto를 반환한다. 아래 설명에 따라 더 자세히 말하자면, 매개변수로 받은 id 값을 통해 BoardDto가 반환된다. id에 해당하는 dto가 없으면 null을 반환한다.
getOrDefault(Object key, V DefaultValue)
key는 값을 가져와야 하는 요소의 키이다. DefaultValue는 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값이다. 반환값은 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환된다.
readAll : HashMap의 values 메소드를 이용해 BoardDto를 Collection에 담아 반환한다.
public Collection<V> values()
해당 map의 value 목록을 Collection 형태로 리턴한다.
update : 매개변수로 전달받은 id 값을 기반으로 containsKey 메소드를 이용해 key 값으로 id가 존재한다면 id에 해당하는 value를 매개변수로 전달받은 dto로 세팅하고 true를 반환한다. 그렇지 않다면 false를 반환한다.
delete : 매개변수로 전달받은 id 값을 기반으로 containsKey 메소드를 이용해 key 값으로 id가 존재한다면 해당 id를 key 값으로 갖는 것을 제거한다.
@RestController
@RequestMapping("board")
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
private final BoardRepository boardRepository;
public BoardController(BoardRepository boardRepository){
this.boardRepository = boardRepository;
}
@PostMapping
public ResponseEntity<BoardDto> createBoard(@RequestBody BoardDto dto) {
return ResponseEntity.ok(boardRepository.create(dto));
}
@GetMapping("{id}")
public ResponseEntity<BoardDto> readBoard(@PathVariable("id") Long id) {
BoardDto dto = boardRepository.read(id);
if(dto == null) return ResponseEntity.notFound().build();
return ResponseEntity.ok(dto);
}
@GetMapping
public ResponseEntity<Collection<BoardDto>> readBoardAll() {
return ResponseEntity.ok(this.boardRepository.readAll());
}
@PutMapping("{id}")
public ResponseEntity<?> updateBoard(@PathVariable("id") Long id, @RequestBody BoardDto dto) {
if(!boardRepository.update(id, dto)) return ResponseEntity.notFound().build();
return ResponseEntity.noContent().build();
}
@DeleteMapping("{id}")
public ResponseEntity<?> deleteBoard(@PathVariable("id") Long id) {
if(!boardRepository.delete(id)) return ResponseEntity.notFound().build();
return ResponseEntity.noContent().build();
}
}
ResponseEntity
를 준다는 것이다. 나는 처음 스프링부트로 API를 만드는 프로젝트를 했을 때, 반환값을 무조건 Dto 클래스로 했고 이런식으로 작업하면 Json 형태로 body에 담겨 응답하는 것을 볼 수 있었다.
쓰다보니 꽤 길어져 Post에 관한 내용은 다음 글에 이어서 작성하도록 하겠다.