섹션4) 회원 관리 예제 - 백엔드 개발
3주차 스터디 시작합니다 ~~

비즈니스 요구사항 정리

• 컨트롤러 : 웹 MVC의 컨트롤러 역할 (api 등을 만들때)
• 서비스 : 도메인 객체를 가지고 핵심 비즈니스 로직 구현 (ex. 회원은 중복 가입이 안 됨)
• 도메인 : 회원, 주문, 쿠폰 등 데이터베이스에 저장하고 관리되는 비즈니스 도메인 객체
• 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리

회원 리포지토리는 인터페이스로 설계 -> 아직 데이터 저장소가 선정되지 않음
일단 개발을 진행하기 위해 가벼운 메모리 기반의 데이터 저장소를 구현체로 사용한다. (구체적인 기술들이 선정되고 나면 바꿔끼움)
회원 도메인과 리포지토리 만들기
실습을 하면서 배워봅시당

도메인을 만들고 리포지토리를 인터페이스로 만들어 온 뒤 4가지 기능(save, findById, findByName, findAll)을 만든 모습이다.
🚨여기서 잠깐 ! !
Optional은 Java 8에서 도입된 클래스로 주 목적은 null을 직접 다루는 걸 피해서 코드의 안정성과 가독성을 높이는 것이라고 한다.
Optional은 언제 쓰면 좋을까?
• null을 직접 반환하거나 전달하는 대신 사용
• API의 명확한 계약: “이건 null일 수도 있어”라고 알려줌
• 단, 필드로 Optional을 쓰는 건 비추 (예: 엔티티 내부 필드 등 → 메모리 낭비) ! !

이렇게 코드를 전부 작성하였고 다음으로 넘어가서 이 코드가 제대로 동작하는지 안 하는지 검증해보자!!~~
회원 리포지토리 테스트 케이스 작성
개발한 기능을 실행해서 테스트 할 때, 자바의 main 메서드로 실행하거나 웹 애플리케이션의 컨트롤러를 통해 해당 기능을 실행하는데, 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행과 여러 테스트를 한번에 실행하기 어렵다는 단점이 있어서 자바에서는 JUnit이라는 프레임워크로 테스트코드를 만들어서 이러한 문제를 해결한다고 한다!
직접 해보면서 무슨 말인지 이해해보쟈

이때 꼭 public 으로 안 해도 된다.

테스트 실행을 했는데 오류가 났다 . . .
member파일을 만들때 대소문자가 통일이 안 된 것으로 추정...😅
다시 만들어주었다!

암튼 해결하고 강의에 나온대로 테스트를 계속 돌려보며 검증해보았다.
중간에 findByName을 실행할 때 에러가 난 이유는 findAll이 먼저 실행이 됐기 때문이다.
그래서 테스트가 하나 끝날때마다 리포지토리를 깔끔하게 지워주는 코드가 필요하다고 한다.


이 코드들을 추가해서 다시 실행해주면 초록불이 들어온당
테스트는 서로 의존관계 없이 설계되어야 하기 때문에 이 과정이 굉장히 중요함!!!
회원 서비스 개발
회원 서비스는 회원 리포지토리와 도메인을 활용하여 실제 비즈니스 로직을 작성하는 것이다.

서비스 패키지를 만들고 멤버서비스 클래스에 코드를 작성한다.

과거에는 ifNull ~ 이런 식으로 코딩을 했지만 지금은 null일 가능성이 있으면 Optional로 한번 감싸서 반환을 해주고 그 덕분에 ifPresent 이런 기능들을 사용할 수 있다.

Optional 이하의 코드를 이렇게 줄여서 작성하는 것도 가능하다.

보통 서비스는 비즈니스에 의존적으로 설계하고 리포지토리는 기계적으로 용어를 선택한다.

이렇게 return까지 해주면 코드 작성 끝 ~~
회원 서비스 테스트
패키지 서비스 생성하고 ••• 이렇게 직접 하는 것 대신 단축키를 사용해보쟈


짜잔
자동으로 만들어졌당
테스트에서는 이름을 한글로 적어도 무방하다.
(join을 회원가입이라고 써도 ok~~)
given, when, then에 코드를 채워주고 실행해보면
회원가입 테스트 성공 !
join에서의 핵심은 중복 회원 검증 로직의 예외 발생을 확인하는 것이기 때문에
한번
직접
확인해보자

이렇게 하면 member1과 member2의 이름이 spring으로 중복되기 때문에 예외가 발생하는 것을 확인할 수 있다!

이때 try ~ catch로 실행하는 것보다
이렇게 assertThrows로 실행하는 것이 더 좋다고 한다.

동작 전에 이 코드를 넣어주면 테스트마다 완전히 새로운 상태로 시작할 수 있게 된다.(이전 테스트의 결과가 다음 테스트에 영향을 주면 안 되기 때문)
마찬가지로

이 코드는 아까 테스트 케이스 작성할때 봤던 것처럼 테스트가 끝난 후에 저장소를 비워서 깔끔하게 정리해주기 때문에 다음 테스트에 영향을 주지 않는다.
이것을 DI(Dependency Injection)라고 하는데 이것에 대해선 다음 스터디에서 알아보도록 하자 . . .
그럼 수고하셨습니당
중간고사 파이팅 . . .👍🏻
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2025 1학기 스프링부트 스터디] 김민서 #3주차 (0) | 2025.04.13 |
---|---|
[2025 1학기 스프링부트 스터디] 정다은 #3주차 (0) | 2025.04.12 |
[2025 1학기 스프링부트 스터디] 이상래 #3주차 (0) | 2025.04.11 |
[2025 1학기 스프링부트 스터디] 오세웅 #3주차 (0) | 2025.04.10 |
[2025 1학기 스프링부트 스터디] 최비성 #2주차 (0) | 2025.04.09 |