이 포스트는 스프링 부트 학습을 입문하는 한 방법으로 챗지피티의 도움을 받아 CRUD 서비스를 만드는 과정을 담았다.
잡담
2025년 초까지 한국에서 웹 백엔드는 스프링이 대부분을 차지하고 있다. 프로그래머스 설문조사에서는 현업인 응답자의 29%가 스프링을 쓰는 것으로 나타났다.
그렇다. 한국 국적을 가진 개발자는 기본 소양으로 스프링 부트를 할 줄 알아야 한다.
한국 개발 시장은 자바 공화국이라는 밈이 유지되어 스프링 공화국까지 온 것이다.
그러면 기본 소양을 쌓기 위해 스프링을 알아볼까... 그런데 내가 개발해 왔던 환경보다 너무 복잡해서 이해할 수 없었다.
노드 할 때는 대충 npm, yarn에서 받고 파이썬 할 때는 대충 pip으로 받고 유니티 엔진 할 때는 에셋스토어에서 구매 버튼 딸깍이면 할 수 있던 환경이 아니었다.
대한민국에서 스프링 1타 강좌로 불리는 분의 커리큘럼을 보면 무료 입문 강의만 봐도 섹션 9개의 미친 분량을 자랑한다.
그래서 듣다가 접었지만 다행히 지금은 챗지피티가 있다. 그래서 챗지피티와 같이 CRUD 서비스를 만들어봤다.
시작
우리의 챗지피티에게 물어봤더니 5 섹션이면 된다고 했다. 참 좋다.
그런데 포스트에서는 사실 3까지만 했다. 일단 스프링 부트 자체를 써보는게 주목적이기 때문이다.
그럼 일단 자바를 굴려야 하므로 jdk를 설치한다.
요즘 jdk는 테무린이라는 걸 쓴다고 한다. 자바에 관심을 끈 사이 많은게 바뀌었다.
코틀린을 쓰는 코프링도 물어봤다.
자바 쓰랜다. 내친 김에 Maven이랑 Gradle이 뭔지도 물어본다.
Spring Initializr 가서 프로젝트를 다운로드하여 에디터에서 연다.
이러면 프로젝트를 개발할 준비가 다 되었다.
코딩 시작
스프링 부트는 데모로 제공하는 엔드포인트가 없다. 하나부터 내가 만들어야 한다.
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // 이 클래스를 REST API 컨트롤러로 지정
@RequestMapping("/api") // 기본 URL 설정
public class HelloController {
@GetMapping("/hello") // GET 요청을 받을 엔드포인트 설정
public String sayHello() {
return "Hello, Spring Boot!";
}
}
/api/hello로 접근하는 엔드포인트가 생긴다.
서버를 실행하니 몇번 포트인지 안 쓰여있어서 물어봤더니 8080이라고 한다.
CRUD의 시작은 엔티티, 서비스, 컨트롤러 클래스를 만드는 것에서 시작한다. 너무 많아서 코드는 생략한다.
여기까지 하면 데이터를 일단 어레이리스트에 담아서 관리하는 기능까지 한다.
다음은 메모리에 관리하던 데이터를 실제로 DB에 연동하기다. 여기서 H2 DB라는 녀석이 나오는데 스프링 개발 환경에서 많이 쓰이는 DB라고 한다.
build.gradle에서 JPA와 H2 DB 의존성을 추가하고 데이터 클래스를 JPA 엔티티로, 서비스 클래스에서 메모리로 관리하던 데이터를 H2 DB와 연동하는 방식으로 바꾼다.
그리고 repository 클래스를 만들어 준다. 이걸 만들면 정말 좋다고 한다.
package com.example.demo.repository;
import com.example.demo.model.Item;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ItemRepository extends JpaRepository<Item, Long> {
}
이러면 repository.findAll(), save(), deleteById() 같은 CRUD 기능을 자동으로 지원한다고 한다.
근데 JPA가 뭔데..?
아, 이게 말로만 듣던 ORM이었다. SQL 쿼리를 짜지 않고도 동일한 역할을 하게 해주는 사기 기술이다.
이제는 백엔드에서 ORM 안 쓰면 원시인 취급을 당한다.
여기까지 해서 JPA를 이용해 쿼리 없이 CRUD를 해봤다. 다음은 H2 DB를 PostgreSQL로 교체해 보도록 한다.
이 프로젝트에 쓰일 DB를 만들어주고 JDBC 드라이버로 H2 대신 PostgreSQL를 쓰도록 변경하면 된다.
근데 테이블이 안 만들어진다. application.properties에서 아래 옵션을 줘 자동으로 테이블을 생성하도록 할 수 있다.
spring.jpa.hibernate.ddl-auto=update
근데 JPA 엔티티로 바꾸면서 교묘하게 @Data 어노테이션을 빼버렸다. 왜그런지 물어봤다.
lombok.Data는 getter setter와 같은 메서드를 코딩 없이 만들어주는 역할을 하는데 JPA 엔티티에서는 문제가 생기니 세분화해서 쓰라고 한다.
다음은 서비스 레이어를 만들라고 한다. 비즈니스 로직을 컨트롤러에서 분리하는 게 목적이다.
서비스 레이어를 만들었으면 이제 DTO를 적용하라고 한다. request용 DTO와 response용 DTO 클래스를 만들어준다.
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
public class ItemRequestDto {
private String name;
private int quantity;
}
import lombok.Getter;
import lombok.AllArgsConstructor;
@Getter
@AllArgsConstructor
public class ItemResponseDto {
private Long id;
private String name;
private int quantity;
}
둘을 대조해보면 확실히 사용자가 id를 변경하는 참사는 일어나지 않을 것임을 알 수 있다.
이어서 컨트롤러와 서비스에서 데이터 클래스에 직접 접근하는 대신 dto를 쓰도록 변경한다.
이제 클라이언트 입력을 검증하는 기능과 예외 처리를 만들자.
jakarata.validation에서 다양한 유효성 검사 옵션을 적용하는데 프로젝트에 적절한 것을 넣으면 된다.
다음으로 예외처리 기능도 넣어주면 된다.
따라가다 보면 어느덧 배포 준비까지 온다.
스프링 부트는 개발용과 프로덕션 용으로 프로파일을 분리할 수 있다. 프로덕션용 프로파일을 활성화하여 빌드한다.
빌드한 JAR 파일을 도커 컨테이너로 구동하고 서비스를 테스트해 보자.
그런데 500 에러가 뜬다. 왜인고 하니 도커로 올라가면 별도의 네트워크로 들어가기 때문에 localhost 대신 host.docker.internal을 써야 한다고 한다. url를 바꿔준다.
이제 정상적으로 CRUD 기능이 작동한다.
이렇게 나는 스프링 부트를 겨우 입문할 수 있었다.
스프링 부트의 CRUD 구조
근데 왜 이렇게 입문하는데도 겹겹이 레이어를 나눴던 걸까? 스프링 부트의 구조를 물어봤다.
/src/main/java/com/example/demo
│── controller/
│ ├── ItemController.java <-- 엔드포인트를 처리하는 컨트롤러
│
│── service/
│ ├── ItemService.java <-- 비즈니스 로직을 담당하는 서비스
│
│── repository/
│ ├── ItemRepository.java <-- JPA를 활용한 데이터 접근 계층
│
│── model/
│ ├── Item.java <-- 데이터베이스 테이블과 연결되는 엔티티 클래스
│
│── DemoApplication.java <-- 메인 애플리케이션 (Spring Boot 실행)
그렇다. 스프링 부트는 컨트롤러 - 서비스 - 리포지토리 3개의 레이어를 기본으로 깔고 간다.
여담으로 왜 이렇게 복잡한 구조인지도 물어봤다.
그렇다. 스프링 부트는 대규모 프로젝트 최적화라 나 같은 소시민이 접할 일이 없던 것이었다.
확실히 프로젝트의 규모가 커질수록 사전에 구조를 잡아놓는 게 편할 테니 큰 규모의 기업을 가고자 하면 스프링 부트는 필수로 공부해야 할 것으로 보인다.
이렇게 챗지피티를 사용하면서 스프링 부트를 입문하는 과정을 써봤다. 만약 나처럼 압도적인 분량에 겁을 먹는 사람이 있으면 챗지피티로 시작해 보는 것도 좋을 것이다.