Spring boot

[입문] 회원 관리 예제_백엔드 개발

비즈니스 요구사항 정리

일반적인 웹 어플리케이션 계층 구조

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

데이터 저장소가 선정되지 않아 인터페이스로 구현 클래스를 변경할 수 있도록 설계함

RDB로 할지 JPA로 할지 등 정해지면 바꿔 끼울 것

 


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

shift + F6 : 파일 이름 변경

Optional이란?

Java 8에 포함된 기능

id로 찾지 못한 경우 null로 반환 하는 대신 Optional으로 감싸서 반환

Optional.ofNullable()로 감싸 반환하면 클라이언트에서 대응할 수 있음

 

실무에서는 동시성 문제가 있어 conquerent hash? 써야하지만 여기는 예제라 그냥진행

 


회원 레포지터리와 테스트케이스 작성

제대로 동작하는지 확인하기 위해 JUnit 프레임워크로 테스트 실행

src/test/java 밑에 보통 같은 이름으로 패키지 생성

같은 이름으로 클래스 생성하고 관례적으로 Test를 뒤에 붙여줌

굳이 public class일 필요 없음

 

새 member를 만들고 저장하고 비교하는 코드

@Test를 붙이면 그 함수를 실행시켜볼 수 있음

 

직접 텍스트를 모두 확인하기 어려움 -> JUnit 의 Assertions활용

실패한 경우 difference 확인 가능

 

요즘은 org.assertj.core의 Assertions.assertThat()를 많이 사용

클래스에서 실행하면 내부 test코드 한번에 실행시킬 수 있음

테스트 함수가 실행되는 순서는 보장되지 않음 -> 순서와 관계없이 메소드별로 따로 동작하도록 설계해야 함

 

TDD (Test Driven Development)

테스트 주도개발

 


회원 서비스

ctrl + alt + v : 리턴 변수 만들어줌

ctrl + alt + shift + T : Refactor this

단축키 확인법: File - Setting - keymap - 검색

 

서비스는 비즈니스 로직과 관련된 네이밍 해야 함 (join 등...)

 


회원 서비스 테스트

ctrl + shift + T : Create New Test

테스트 코드의 함수 이름은 종종 한글로 짓기도 함

빌드 시 테스트 코드는 포함되지 않음

 

@Test
public void Test() {
  //given
  기존 데이터

  //when
  특정 상황

  //then
  동작
}

given-when-then 문법

 

ctrl + shift + F10 : 이전 실행했던 것 다시 실행

 

Dependency Injection : 외부에서 필요한 클래스 넣어줌. DI라고 한다.