끼니 - 프로젝트 시작

김주형·2025년 1월 22일
0

기술부채

목록 보기
1/4

기존 아이디어 '멍상'을 폐기하고
실패 원인을 복기해본 결과
채용시장에서 요구하는 내용들에 근거한 백엔드 api를 구현해서 포트폴리오로 제출하기로 결심했습니다.

제목은 간단히 '끼니', 직장인 점심 구독 배달 서비스입니다.

--

  1. 프로젝트 소개

'끼니' 직장인을 위한 도시락 구독 서비스

  • Spring Boot를 활용하여 REST API를 개발
  • TDD(Test-Driven Development) 방식으로 개발
    • 도전꺼리) 테스트 커버리지 100%
  • 실사용 가능한 시스템이 목표로 합니다.
    • 도전꺼리) 최대 100명 수용 가능한 시스템 확장

2. 개발 환경 설정

2.1. 프로젝트 생성


  • Spring Initializr에 접속

아래 설정으로 프로젝트를 생성합니다

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

  • Spring Web: REST API 구현을 위한 필수 의존성
  • Spring Data JPA: 데이터베이스 연동
  • H2 Database: 로컬 개발용 데이터베이스
  • Lombok: 코드 간소화 (Getter/Setter 자동 생성)
  • Validation: 입력값 검증

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 데이터베이스 설정

  • src/main/resources/application.properties 파일을 생성하고 아래 내용을 추가합니다:
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. TDD(Test-Driven Development) 방식 개발

3.1. 기능 정의

'끼니' 서비스의 주요 기능

  • 주문 생성

    • 사용자 이름, 도시락 항목, 배송 주소를 입력받아 주문 생성
  • 주문 조회

    • 특정 주문 ID를 조회하여 주문 정보 반환
  • 주문 수정

    • 주문 상태를 변경 (e.g., "PENDING" → "DELIVERED")
  • 주문 삭제

    • 특정 주문 ID를 삭제

3.2. 첫 번째 테스트 작성

  • OrderControllerTest 클래스에서 주문 생성 테스트를 작성
@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와 OrderService를 작성

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를 추가하여 로직을 완성합니다.

  1. 앞으로 추가할 내용

CRUD 기능 확장

Swagger로 API 문서화

테스트 커버리지 100% 달성

기본 인증 기능 추가 (Optional)

이 블로그를 통해 프로젝트를 이해하고 질문에 답변할 수 있는 기반을 마련했습니다. 추가 개발 내용은 지속적으로 업데이트하겠습니다.

profile
도광양회

0개의 댓글

관련 채용 정보