Lined Notebook

🍃 스프링 입문 스터디 4일 차 정리

by juraffe juraffe
이 글은 김영한 님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 학습하며 작성된 글입니다.

스프링 입문 스터디 4일 차 정리

 

비즈니스 요구사항 정리

이 챕터는 앞으로 실습하게 될 프로젝트에 비즈니스 요구를 설명하는 챕터로 영상 강의로 대체합니다. [바로가기]

 

회원 도메인과 리포지토리 만들기

이번 챕터에서는 앞서 설명된 비즈니스 요구사항에 맞게 회원의 도메인과 이를 접근하기 위한 리포지토리를 작성한다. 강의에서는 In-memory 방식으로 설명하였기 때문에 학습을 위해 이 글에선 mongodb를 활용해 도메인과 레포지토리를 구현해보려 한다. 먼저 MongoDB를 사용하기 위해 의존성을 추가한다.

# build.gradle.kts
dependencies {
	...생략...
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
}

# application.properties
spring.data.mongodb.uri=mongodb://username:password@localhost/dbname?authSource=admin

의존성이 추가되었다면 이제 회원에 대한 도메인 객체와 이를 관리하는 리포지토리를 추가한다.

package com.inflearn.springbeginner.springbeginner.domains

import org.bson.types.ObjectId
import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.Document

@Document
data class Member(
    @Id val id: ObjectId = ObjectId.get(),
    val name: String
) {}

먼저 도메인 객체를 위와 같이 선언했다. @Document 어노테이션은 MongoDB에서 도메인 객체를 식별하기 위해 추가하였고, 아래 @Id 어노테이션을 도메인 객체별로 식별하기 위한 Id 필드임을 명시한다. 이후 요구사항에 맞게 해당 객체를 구성하면 된다.

package com.inflearn.springbeginner.springbeginner.repositories

import com.inflearn.springbeginner.springbeginner.domains.Member
import org.springframework.data.mongodb.repository.MongoRepository

interface MemberRepository : MongoRepository<Member, String> {

    fun findByName(name: String): Member?
}

다음 도메인 객체를 접근하기 위한 리포지토리 객체를 만드는데 여기서 MongoDB의 경우 MongoRepository 인터페이스를 상속받아 리포지토리를 구성하게 된다. 추가적으로 JPA나 MongoDB의 Repository 인터페이스들은 메서드명을 분석하여 필요에 맞는 쿼리를 생성해 매우 편리한 기능을 제공하게 된다. 위의 경우 findByName 메서드는 이름을 기반으로 Member를 찾는 쿼리를 자체적으로 만들어주게 된다.

 

회원 리포지토리 테스트 케이스 작성

테스트 케이스는 단순 반복적인 테스트를 일괄적이며 자동적으로 수행할 수 있고, 또 CI/CD와의 연동을 통해 안정적인 배포등 많은 이점이 존재한다.

package com.inflearn.springbeginner.springbeginner.services

import com.inflearn.springbeginner.springbeginner.domains.Member
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest
internal class MemberServiceTest @Autowired constructor(private val memberService: MemberService) {

    @Test
    fun createMember() {
        val member = this.memberService.createMember(Member(name = "hello"))
        Assertions.assertEquals("hello", member.name)
    }
}

위 코드에서 테스트는 새로운 멤버를 생성하고 생성된 멤버의 이름이 동일한 이름인지를 검사하는 아주 간단한 테스트이다. 테스트의 작성은 위 코드 처럼 단순한 경우부터 잘못된 입력값 또는 비정상적인 동작을 유발하여 서비스가 정상적으로 동작하는지에 대해서 테스트할 필요가 있다.

블로그의 정보

🦒 Juraffe's note

juraffe juraffe

활동하기