1. Spring CRUD 실습
- Spring에서 3 Layer Architecture 패턴을 기반으로 Create, Read, Update, Delete 기능을 구현하는 실습을 해보았다.
2. Controller
- 클라이언트로 부터 요청을 Service로 전달한다.
@RestController
@RequiredArgsConstructor
public class MemoController {
private final MemoService memoService;
@PostMapping("/memos")
public ResponseEntity<MemoCreateResponse> create(
@RequestBody MemoCreateRequest request
) {
return ResponseEntity.status(HttpStatus.CREATED).body(memoService.save(request));
}
@GetMapping("/memos")
public ResponseEntity<List<MemoGetResponse>> getAll() {
return ResponseEntity.status(HttpStatus.OK).body(memoService.findAll());
}
@GetMapping("/memos/{memoId}")
public ResponseEntity<MemoGetResponse> getOne(
@PathVariable Long memoId
) {
return ResponseEntity.status(HttpStatus.OK).body(memoService.findOne(memoId));
}
@PutMapping("/memos/{memoId}")
public ResponseEntity<MemoUpdateResponse> update(
@PathVariable Long memoId,
@RequestBody MemoUpdateRequest request
) {
return ResponseEntity.status(HttpStatus.OK).body(memoService.update(memoId, request));
}
@DeleteMapping("/memos/{memoId}")
public void delete(
@PathVariable Long memoId
) {
memoService.delete(memoId);
}
}
3. Service
- Controller에서 받은 요청으로 Repository에 접근해서 조회를 한다.
@Service
@RequiredArgsConstructor
public class MemoService {
private final MemoRepository memoRepository;
@Transactional
public MemoCreateResponse save(MemoCreateRequest request) {
Memo memo = new Memo(request.getText());
Memo savedMemo = memoRepository.save(memo);
return new MemoCreateResponse(
savedMemo.getId(),
savedMemo.getText(),
savedMemo.getCreatedAt(),
savedMemo.getModifiedAt()
);
}
@Transactional(readOnly = true)
public List<MemoGetResponse> findAll() {
List<Memo> memos = memoRepository.findAll();
List<MemoGetResponse> dtos = new ArrayList<>();
for (Memo memo : memos) {
MemoGetResponse dto = new MemoGetResponse(
memo.getId(),
memo.getText(),
memo.getCreatedAt(),
memo.getModifiedAt()
);
dtos.add(dto);
}
return dtos;
}
@Transactional(readOnly = true)
public MemoGetResponse findOne(Long memoId) {
Memo memo = memoRepository.findById(memoId).orElseThrow(
() -> new IllegalStateException("없는 메모입니다.")
);
return new MemoGetResponse(
memo.getId(),
memo.getText(),
memo.getCreatedAt(),
memo.getModifiedAt()
);
}
@Transactional
public MemoUpdateResponse update(Long memoId, MemoUpdateRequest request) {
Memo memo = memoRepository.findById(memoId).orElseThrow(
() -> new IllegalStateException("없는 메모입니다.")
);
memo.update(request.getText());
return new MemoUpdateResponse(
memo.getId(),
memo.getText(),
memo.getCreatedAt(),
memo.getModifiedAt()
);
}
@Transactional
public void delete(Long memoId) {
boolean existence = memoRepository.existsById(memoId);
if(!existence) {
throw new IllegalStateException("없는 메모입니다.");
}
memoRepository.deleteById(memoId);
}
}
4. Repository
- JpaRepository를 통해서 메서드를 상속받는다
import com.basicmemo.entity.Memo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MemoRepository extends JpaRepository<Memo, Long> {
}
5. 마무리
- 3 Layer Architecture 패턴을 기반으로 코드를 작성해보았다. 패키지를 나눠서 작성을 해보니 각각 무슨 기능을 하는지 알아보기 쉬웠다.
6. 트러블 슈팅
- 커밋, 푸쉬를 하는 과정에서 오류가 발생해 github에 코드가 올라가지 않는 오류가 생겼다.
-> .git 폴더를 삭제해서 기존 git repository와 연결을 끊고 새로운 repository를 생성해서 다시 연결을 하니 제대로 푸쉬가 되었다.