Spring 입문 - Part 3 : 회원 관리 예제 - 백엔드 개발

2025. 3. 26. 20:40·Spring

강의명 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

지식공유자 : 김영한

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

[지금 무료]스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프런

김영한 | , 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세요!본 강의는 자바 스프링 완전 정복 시리즈의 첫 번째 강의입니다. 우아한형제들 최연소 기술이

www.inflearn.com


비즈니스 요구사항 정리

  • 데이터 : 회원ID, 이름
  • 기능 : 회원 등록, 조회
  • 아직 데이터 저장소가 선정되지 않음(가상의 시나리오)

  • 컨트롤러: 웹 MVC의 컨트롤러 역할
  • 서비스: 핵심 비즈니스 로직 구현
  • 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

클래스 의존관계

 

  • 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
  • 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정
  • 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용

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

  • domain package를 생성하고 Member class를 생성한다.
  • repository package를 생성하고 MemberRepository interface를 생성한다.

  • Member class에 회원 ID, 이름에 대한 필드를 작성한다. 
  • getter, setter를 작성한다. (윈도우에서는 alt + insert를 통해 할 수 있다)

  • interface에 네 가지 기능을 정의한다.

  • MemberRepository를 MemoryMemberRepository로 구현한다. 작성한 코드는 위와 같다.
  • 동시성을 고려하기 위해 실무에서는 AtomicLong, ConcurrentHashMap등을 고려할 수 있다.

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

스프링에서도 따로 test 폴더가 존재할 정도로 테스트코드의 활용이 중요해지고 있다. 

 

간단한 문제를 풀거나 프로젝트를 진행할 때 작성한 코드를 테스트하기 위해서 main 메서드를 반복해서 실행한다. 프로그램의 크기가 커지거나, 단순 반복을 실행할 때에는 이러한 방법은 오랜 시간이 소요된다는 단점이 있다. 

 

JUnit이라는 Java 프레임워크는 이러한 단점을 극복하고 원하는 부분을 반복 테스트할 수 있는 기능을 제공한다.

 

 

    • 아까와는 다르게 src/test/java 경로에 repository package를 생성하고, MemoryMemberRepositoryTest class를 생성한다.
    • test 코드에서는 원래 클래스명에 Test를 붙이는 것이 관례이다.

  • 다른 곳에서 사용하지 않을 것이므로, public을 삭제해도 된다.

  • Assertions를 사용할 때, assertj를 사용하려면 다음과 같이 해야 한다.
Assertions.assertThat(member).isEqualTo(result);
  • Assertions에 커서를 두고 alt + enter를 입력하여 static import를 한다.

  • 이후 아래와 같이 코드를 사용하면 된다.
assertThat(member).isEqualTo(result);

 

Test Code

 

@AfterEach

  • 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다.
  • 이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다.
  • @AfterEach 를 사용하면 각 테스트가 종료 될 때 마다 이 기능을 실행한다.
  • 여기서는 메모리 DB에 저장된 데이터를 삭제한다.

Test

  • 테스트는 각각 독립적으로 실행되어야 한다.
  • 테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.

회원 서비스 개발

MemberService

 

※단축키

ctrl + alt + V : refactory

ctrl + alt + M : method extract

회원 서비스 테스트

MemberService

 

  • MemberService에서 MemberRepository 코드를 DI(Dependency Injection, 의존성 주입) 가능하게 변경한다.
  • 기존 코드에서는 MemberService와 MemberServiceTest에서 MemberRepository 인스턴스를 각각 생성한다.
  • 이렇게되면 실제 서비스와 다른 인스턴스로 테스트를 진행하게 된다.
  • DI(의존성 주입)를 통해 MemverService에서는 MemberRepository 인스턴스를 외부에서 주입받는다.
  • 결국 하나의 인스턴스로 테스트를 진행할 수 있게 된다.

MemberServiceTest

  • test code는 한글로 작성해도 된다.

Given, When, Then

  • given : 무언가가 주어짐
  • when : 이것을 실행했을 때
  • then : 그에 대한 결과

 

@BeforeEach

  • 각 테스트 실행 전에 호출된다.
  • 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계도 새로 맺어준다.
  • 앞서 MemberService가 MemberRepository 인스턴스를 주입받도록 변경했으므로, new로 인스턴스를 생성할 때, 매개변수로 memberRepository를 넣어줘야 한다.

 

※단축키

ctrl + shift + T : test생성

 

후기

  • Optional, DI에 대한 추가 학습이 필요할 것 같다.

'Spring' 카테고리의 다른 글

Spring 입문 - Part 2 : 스프링 웹 개발 기초  (0) 2025.03.24
Spring 입문 - Part 1 : 프로젝트 환경 설정  (0) 2025.03.22
'Spring' 카테고리의 다른 글
  • Spring 입문 - Part 2 : 스프링 웹 개발 기초
  • Spring 입문 - Part 1 : 프로젝트 환경 설정
dev-cyan
dev-cyan
  • dev-cyan
    Cyan Archive
    dev-cyan
  • 전체
    오늘
    어제
    • 분류 전체보기 (9)
      • 멋쟁이사자처럼 (5)
        • CO:SSION (4)
        • BE:SSION(Django) (1)
      • Spring (3)
      • Docker (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dev-cyan
Spring 입문 - Part 3 : 회원 관리 예제 - 백엔드 개발
상단으로

티스토리툴바