기존 아이디어 '멍상'을 폐기하고
실패 원인을 복기해본 결과
채용시장에서 요구하는 내용들에 근거한 백엔드 api를 구현해서 포트폴리오로 제출하기로 결심했습니다.
제목은 간단히 '끼니', 직장인 점심 구독 배달 서비스입니다.
--
'끼니' 직장인을 위한 도시락 구독 서비스
아래 설정으로 프로젝트를 생성합니다
Project: Gradle - Groovy
Language: Java
Spring Boot Version: 3.4.1
Group: com.kkinni
Artifact: kkinni
Name: kkinni
Description: Office Lunch Subscription Service
ADD DEPENDENCIES
GENERATE 버튼을 눌러 프로젝트를 생성하고, 다운로드한 ZIP 파일을 IDE에서 엽니다.
2.2. Gradle 설정
build.gradle 파일에서 추가한 의존성을 확인합니다:
plugins {
id 'org.springframework.boot' version '3.4.1'
id 'io.spring.dependency-management' version '1.1.3'
id 'java'
}
group = 'com.kkinni'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
runtimeOnly 'com.h2database:h2'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
2.3. H2 데이터베이스 설정
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
3.1. 기능 정의
'끼니' 서비스의 주요 기능
주문 생성
주문 조회
주문 수정
주문 삭제
3.2. 첫 번째 테스트 작성
@SpringBootTest
@AutoConfigureMockMvc
public class OrderControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldCreateOrder() throws Exception {
String orderJson = "{ \"customerName\": \"Alice\", \"lunchItem\": \"Salad\", \"deliveryAddress\": \"123 Main St\" }";
mockMvc.perform(post("/api/orders")
.contentType(MediaType.APPLICATION_JSON)
.content(orderJson))
.andExpect(status().isOk())
.andExpect(jsonPath("$.customerName").value("Alice"))
.andExpect(jsonPath("$.lunchItem").value("Salad"));
}
}
3.3. 테스트 통과를 위한 최소한의 구현
OrderController.java
@RestController
@RequestMapping("/api/orders")
public class OrderController {
private final OrderService orderService;
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
@PostMapping
public ResponseEntity<Order> createOrder(@RequestBody Order order) {
return ResponseEntity.ok(orderService.createOrder(order));
}
}
OrderService.java
@Service
public class OrderService {
public Order createOrder(Order order) {
// 실제 데이터 저장 로직은 나중에 추가
return order;
}
}
테스트 실행 후 실패를 확인하고, OrderRepository를 추가하여 로직을 완성합니다.
CRUD 기능 확장
Swagger로 API 문서화
테스트 커버리지 100% 달성
기본 인증 기능 추가 (Optional)
이 블로그를 통해 프로젝트를 이해하고 질문에 답변할 수 있는 기반을 마련했습니다. 추가 개발 내용은 지속적으로 업데이트하겠습니다.