2021. 8. 11. 08:00ใBack-End ์์ ์ค/Spring Framework
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ฃผ๋ํ๋์ Spring Boot์ ๋ํด์ ๊ณต๋ถํ๊ณ ์๋ ๊ฒ์ด์์.
์ค๋์ ํ์ ์๋น์ค ๊ฐ๋ฐ ๋ฐฉ๋ฒ๊ณผ Test Case ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถ ํด ๋ณด๋๋ก ํ ๊ฒ์ด์์.
๋ฐ๋ก ์์ ํด ๋ณด๊ฒ ์ต๋๋ค!
์ฝ๋์ ๊ด๋ จํ ๋ด์ฉ์ ์ฃผ๋ํ๋์ Github์์ ํ์ธ ํ์ค ์ ์์ต๋๋ค!
๐ ๋ชฉ์ฐจ
01.[Spring Boot] thymeleaf์ Spring Boot
02.[Spring Boot] Spring Web ๊ฐ๋ฐ ๊ธฐ์ด
03.[Spring Boot] ํ์ ๊ด๋ฆฌ ์์ - Backend
04.[Spring Boot] Service ๊ฐ๋ฐ ๋ฐ Test Case ์์ฑ
05.[Spring Boot] Spring Bean๊ณผ ์์กด๊ด๊ณ
06.[Spring Boot] Java Code๋ก ์ง์ Spring Bean ๋ฑ๋ก
07.[Spring Boot] ๋ฑ๋ก, ๋ชฉ๋ก ๋ณด๊ธฐ ๊ตฌํํ๊ธฐ
08.[Spring Boot] ๊ธฐ์กด ์ฝ๋ ์ ์๋๊ณ , ์ค์ ์ผ๋ก ๊ตฌํ Class ๋ณ๊ฒฝ
09.[Spring Boot] ํตํฉ Test
10.[Spring Boot] JPA
11.[Spring Boot] Spring Data JPA
12.[Spring Boot] AOP
๐ ํ์ ์๋น์ค ๊ฐ๋ฐ
Service ์ชฝ์ ๋น์ฆ๋์ค ์ฉ์ด์ ๋ง๊ฒ ์ด๋ฆ ๋ฑ์ ์ ์ด์ผ ํ๋ค๋ ๊ฑฐ ๋จผ์ ์๊ณ ๊ฐ์ ์ฐ๋ฆฌ!
MemberService.java
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import java.util.Optional;
// ์ปดํฌ๋ํธ ์ค์บ ๋ฐฉ์์ Service
// @Service
public class MemberService { // Service ์ชฝ์ ๋น์ฆ๋์ค ์ฉ์ด์ ๋ง๊ฒ ์ด๋ฆ ๋ฑ์ ์ ์ด์ผ ํ๋ค.
// ์๋ ๋ด์ฉ์์ repository ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , Service Test์์ ๋ new๋ฅผ ํตํด Repository๋ฅผ ์์ฑํด์ ํ
์คํธํ๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๊ฒ ๋๋ค.
// private final MemoryMemberRepository memberRepository = new MemoryMemberRepository();
// ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ด ์์ฑ์๋ฅผ ํตํด ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ํด ์ค๋ค.
private final MemoryMemberRepository memberRepository;
// @Service๊ฐ ์๋ Service๊ฐ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋, @Autowired๊ฐ ๋ถ์ ์์ฑ์๋ ์คํ๋ง์ด ์ปจํ
์ด๋์์ ๋น์ผ๋ก ๊ด๋ฆฌํ ๋, ์์ฑ์๋ฅผ ํธ์ถํ๋๋ฐ, ์ด ๋ MemberService๋ฅผ ๋ฃ์ด์ค๋ค.
@Autowired
public MemberService(MemoryMemberRepository memberRepository) {
this.memberRepository = memberRepository;
} // ์์ฑ์ ๋
// ํ์ ๊ฐ์
public Long join(Member member) {
// ๊ฐ์ ์ด๋ฆ์ด ์๋ ์ค๋ณต ํ์ ๊ฐ์
๋ฐฉ์ง
// Optional<Member> result = memberRepository.findByName(member.getName());
//
// result.ifPresent(memeber -> { // ifPresent๋ ํด๋น ๊ฐ์ด Null์ด ์๋๊ณ , ์ด๋ค ๊ฐ์ด ์์ผ๋ฉด ๋์ (Option๋ก ๊ฐ์ธ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅ)
// throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์ ์
๋๋ค.");
// });
// ์์ ์ฝ๋ ๋ณด๋ค ๋ ์ข์ ์ฝ๋
// memberRepository.findByName(member.getName()).ifPresent(member1 -> {
// throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์ ์
๋๋ค.")
// });
// ์์ ์ฝ๋๋ฅผ Methodํ ํ๋ ๊ฒ์ด ์ข๋ค.
// ํด๋น ์ฝ๋๋ฅผ ๋ชจ๋ ์ ํํ๊ณ , Command + Option + M์ ๋๋ฌ์ค๋ค.
validateDuplicationMember(member); // ์ค๋ณต ํ์ ๊ฒ์ฆ
memberRepository.save(member);
return member.getId();
} // join() ๋
private void validateDuplicationMember(Member member) {
// ์์ ์ฝ๋ ๋ณด๋ค ๋ ์ข์ ์ฝ๋
memberRepository.findByName(member.getName()).ifPresent(member1 -> {
throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์ ์
๋๋ค.");
});
} // validateDuplicationMember() ๋
public List<Member> findMembers() {
return memberRepository.findAll();
} // findMembers() ๋
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
} // findOne() ๋
} // Class ๋
์ฃผ๋ํ๋์ด ์์ ์ฃผ์์ฒ๋ฆฌํ ๋ถ๋ถ์ธ
@Service
public class MemberService { // Service ์ชฝ์ ๋น์ฆ๋์ค ์ฉ์ด์ ๋ง๊ฒ ์ด๋ฆ ๋ฑ์ ์ ์ด์ผ ํ๋ค.
// ์๋ ๋ด์ฉ์์ repository ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , Service Test์์ ๋ new๋ฅผ ํตํด Repository๋ฅผ ์์ฑํด์ ํ
์คํธํ๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๊ฒ ๋๋ค.
private final MemoryMemberRepository memberRepository = new MemoryMemberRepository();
์์ ๊ฐ์ด new๋ฅผ ํตํด์ Repository ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด์์.
๊ทธ๊ฒ์ ํ๋ ๋ณ์์์ repository ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐจํ์ ๋ง๋ค๊ฒ ๋ Service Test์์ ๋ new๋ฅผ ํตํด Repository๋ฅผ ์์ฑํด์ ํ ์คํธํ๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๊ฒ ๋๋ค๋ ๋ฌธ์ ์ธ ๊ฒ์ด์์.
๊ทธ๋์ ์๋์ ๊ฐ์ด ํ์ ์๋น์ค ์ฝ๋๋ฅผ DI(Denpendency Injection)์ ๊ฐ๋ฅํ๊ฒ ๋ณ๊ฒฝ ํด ์ฃผ๋ ๊ฒ์ด ์ข์์.
public class MemberService {
private final MemoryMemberRepository memberRepository;
public MemberService(MemoryMemberRepository memberRepository) {
this.memberRepository = memberRepository;
} // ์์ฑ์ ๋
} // Class ๋
MemberServiceTest.java
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
// Dependency Injection (DI ๊ธฐ๋ฒ)
public void beforEach() { // test๋ฅผ ์คํํ๊ธฐ ์ ์ MemoryMemberRepository ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค ๋ค ๊ทธ ๊ฐ์ฒด๋ฅผ MemoryMemberRepository ๊ฐ์ฒด๋ฅผ ์์ฑ ํด ์ฃผ๋ฉด์ ๋ฃ์ด์ค๋ค.
memberRepository = new MemoryMemberRepository();
// ์ด๋ ๊ฒ ํด์ค์ผ๋ก MemberService์ MemberServiceTest๊ฐ ๊ฐ์ ๊ฐ์ฒด์ MemoryMemberRepository๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
memberService = new MemberService(memberRepository);
} // beforEach() ๋
@AfterEach
public void afterEach() {
memberRepository.clearStore();
} // afterEach() ๋
@Test
void ํ์๊ฐ์
() {
// given(๋ฌด์์ธ๊ฐ ์ฃผ์ด์ก์ ๋)
Member member = new Member();
member.setName("JunyHarang");
// when(์ด๊ฒ์ ์คํ ํ์ ๋)
Long saveId = memberService.join(member);
// then(๊ฒฐ๊ณผ๊ฐ ์๋์ ๊ฐ์ด ๋์์ผ ํ๋ค. (๊ฒ์ฆ๋ถ))
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
} // ํ์๊ฐ์
() ๋
@Test
public void ์ค๋ณตํ์_์์ธ() {
// given
Member member1 = new Member();
member1.setName("JunyHarang");
Member member2 = new Member();
member2.setName("JunyHarang");
// when
memberService.join(member1);
// try { // ๋ฐฉ๋ฒ 1
// memberService.join(member2);
// fail("์์ธ๊ฐ ๋ฐ์ํด์ผ ํ๋๋ฐ, ๋ฐ์ํ์ง ์์์ต๋๋ค.");
//
// } catch (IllegalStateException e) {
// // MemberService์ Throw ๋ถ๋ถ์ Exception ๋ฐ์ ์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฌธ๊ตฌ์ ๋์ผํ๊ฒ isEqualTo์ ๋ฃ๋๋ค.
// Assertions.assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์ ์
๋๋ค.");
// System.out.println("ํ์ ๊ฐ์
์ด๋ฆ ์ค๋ณต์ผ๋ก ์ธํด ์์ธ ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.");
// }
// ๋ฐฉ๋ฒ 2
// memberService.join()์ member2๋ฅผ ์ ๋ฌํ์ฌ ๋ก์ง์ ์คํํ ๊ฑด๋ฐ, IllegalStateException๊ฐ ๋ฐ์ํด์ผ ์ ์
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
Assertions.assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์ ์
๋๋ค.");
//then
}
์์์ ์ฌ์ฉํ @BeforeEach๋ ๊ฐ Test ์คํ ์ ์ ํธ์ถ๋๋ ๊ฒ์ด์์.
ํ
์คํธ๊ฐ ์๋ก ์ํฅ์ด ์๋๋ก ํญ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ์์กด๊ด๊ณ๋ ๋งบ์ด์ฃผ๋ ์น๊ตฌ๋๋๋ค!
๊ทธ Method์์ ์์ฑํ ๊ฐ์ฒด๋ค์ new๋ก ๋ง๋ค์ด ์ฃผ๋ฏ๋ก ๊ฐ๋ฅํ ๊ฒ์ด์์!
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] Java Code๋ก ์ง์ Spring Bean ๋ฑ๋ก (0) | 2021.08.13 |
---|---|
[Spring Boot] Spring Bean๊ณผ ์์กด๊ด๊ณ (0) | 2021.08.12 |
[Spring Boot] ํ์ ๊ด๋ฆฌ ์์ - Backend (0) | 2021.08.06 |
[Spring Boot] Spring Web ๊ฐ๋ฐ ๊ธฐ์ด (0) | 2021.08.05 |
[Spring Boot] thymeleaf์ Spring Boot (2) | 2021.08.04 |