2021. 8. 6. 08:00ใBack-End ์์ ์ค/Spring Framework
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ฃผ๋ํ๋์ Spring Boot์ ๋ํด์ ๊ณต๋ถํ๊ณ ์๋ ๊ฒ์ด์์.
์ธํ๋ฐ์ ๊น์ํ๋์ ์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ ์ ๋ํด์ ๊ณต๋ถํ๋ฉด์ ํผ๋๋ฅผ ์์ฑ ํด ๋ณด๋๋ก ํ ๊ฒ์ด์์.
๋ฐ๋ก ์์ ํด ๋ณด๊ฒ ์ต๋๋ค!
๐ ๋ชฉ์ฐจ
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
๐ ์์ํ๊ธฐ ์ ์
์ฝ๋์ ๊ด๋ จํ ๋ด์ฉ์ ์ฃผ๋ํ๋์ Github์์ ํ์ธ ํ์ค ์ ์์ต๋๋ค!
๐ Web Application
- Controller : Web MVC Control Role
- Service : Core Business Logic Implementation
- Repository : DB Access, Domain Entity Save to DB and management
- Domain : Business Domain Entiry (Ex: ํ์, ์ฃผ๋ฌธ, ์ฟ ํฐ ๋ฑ๋ฑ ์ฃผ๋ก DB์ ์ ์ฅํ๊ณ ๊ด๋ฆฌ)
DB๊ฐ ์์ง ์ ์ ๋์ง ์์๋ค๋ฉด ์ฐ์ Interface๋ก ๊ตฌํ Class๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ธ ๊ฒ์ด์์.
DB๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ๊ฐ๋ฐ ๋จ๊ณ์์๋ ๊ตฌํ์ฒด๋ก ๊ฐ๋ฒผ์ด Memory ๊ธฐ๋ฐ Data Repository๋ฅผ ์ฌ์ฉํ ์ ์๋ต๋๋ค.
๐ Test Case
๊ฐ๋ฐํ ๊ธฐ๋ฅ์ ์คํํด์ Test ํ ๋ Java์ Main Method๋ฅผ ํตํด ์คํํ๊ฑฐ๋, Web Application์ Controller๋ฅผ ํตํด ํด๋น ๊ธฐ๋ฅ์ ์คํํ ์ ์๋ ๊ฒ์ด์์.
ํ์ง๋ง, ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ค๋นํ๊ณ , ์คํํ๋๋ฐ, ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ๋ฐ๋ณต ์คํํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ด์์.
JAVA๋ JUnit์ด๋ผ๋ Framwork๋ฅผ ํตํด Test๋ฅผ ์คํํ ์ ์๊ฒ ํด ์ค์ผ๋ก ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํด์ฃผ์์ด์.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;
class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@Test
public void save() { // MemoryMemberRepository์ save ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ Test
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
// member์์ ๊ฐ๊ณผ result์์ ๊ฐ์ด ๊ฐ์์ง ๋น๊ต
//Assertions.assertEquals(member, result); ์์ ๊ธฐ๋ฒ
Assertions.assertThat(member).isEqualTo(result);
System.out.println("save TEST์ result ๊ฐ์ " + (member == result) + " ์
๋๋ค.");
}// save() ๋
@Test
public void findByName() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
System.out.println("findByName TEST์ result ๊ฐ์ " + (result == member1) + " ์
๋๋ค.");
Assertions.assertThat(result).isEqualTo(member1);
} // findByName() ๋
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
List<Member> result = repository.findAll();
System.out.println("findByALL TEST์ result ํฌ๊ธฐ๋ " + result.size() + " ์
๋๋ค.");
Assertions.assertThat(result.size()).isEqualTo(2);
} // findAll() ๋
}// TEST Class () ๋
์ด๋ ๊ฒ ํด์ ๊ฐ๊ฐ์ Test๋ฅผ ๋๋ฆฌ๋ฉด ์ ์์ ์ผ๋ก ๋์์ด ๋๋ ๊ฒ์ด์์.
ํ์ง๋ง, ์ ์ฒด ํ ์คํธ๋ฅผ ๋์ ์ํค๋ฉด ์๋์ ๊ฐ์ Error๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด Error๊ฐ ๋๋ ์ด์ ๋ ์ฝ๋์์ ๋ดค์ ๋ findAll() ์ด ๋งจ ์๋์ง๋ง, Test๋ฅผ ํ ๋ ๋ณด๋ฉด ๋งจ ์์ ์คํ ๋ ๊ฒ์ ์ ์ ์๋ ๊ฒ์ด์์.
์ฆ, Test๋ ์์์ ๊ด๊ณ ์์ด ์คํ์ด ๋๋ฉฐ, ์ด๋ ๊ฒ Error๊ฐ ๋๋ ์ด์ ๋ findAll()์์ Member Entity๋ฅผ member1์ผ๋ก ๋ง๋ ๋ค ์ฌ๊ธฐ์ "spring1"์ ๋ฃ๊ณ , 2์ "spring2"๋ฅผ ๋ฃ์๋๋ฐ, findByName()์์๋ ๋์ผํ ์์ ์ ํด์ฃผ๊ณ ์๋ ๊ฒ์ด์์.
์ด๋ฏธ findAll์์ ํด๋น ๋ด์ฉ์ผ๋ก Memory๊ฐ ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋์ง ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ธ ๊ฒ์ด์์.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Test Code์ @AfterEach๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด์์.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;
class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@AfterEach
// Test๊ฐ ํ๋ ๋๋ ๋๋ง๋ค Repository๋ฅผ Clear ์์ผ์ฃผ๊ธฐ ์ํ ์ฝ๋
public void afterEach() {
repository.clearStore();
}
@Test
public void save() { // MemoryMemberRepository์ save ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ Test
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
// member์์ ๊ฐ๊ณผ result์์ ๊ฐ์ด ๊ฐ์์ง ๋น๊ต
//Assertions.assertEquals(member, result); ์์ ๊ธฐ๋ฒ
Assertions.assertThat(member).isEqualTo(result);
System.out.println("save TEST์ result ๊ฐ์ " + (member == result) + " ์
๋๋ค.");
}// save() ๋
@Test
public void findByName() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
System.out.println("findByName TEST์ result ๊ฐ์ " + (result == member1) + " ์
๋๋ค.");
Assertions.assertThat(result).isEqualTo(member1);
} // findByName() ๋
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
List<Member> result = repository.findAll();
System.out.println("findByALL TEST์ result ํฌ๊ธฐ๋ " + result.size() + " ์
๋๋ค.");
Assertions.assertThat(result.size()).isEqualTo(2);
} // findAll() ๋
}// TEST Class () ๋
@AfterEach๋ ๊ฐ Test๊ฐ ์ข ๋ฃ๋ ๋ ๋ง๋ค ์ด ๊ธฐ๋ฅ์ ์คํ ํด ์ฃผ๋๋ฐ, ์ฌ๊ธฐ์์๋ Memory DB์ ์ ์ฅ๋ Data๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด์์.
MemoryMemberRepository.java
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemeberRepository{
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
} //save () ๋
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
} // findById() ๋
@Override
public Optional<Member> findByName(String name) {
return store.values().stream().filter(member -> member.getName().equals(name)).findAny();
} // findByName () ๋
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
} // findAll() ๋
// Test๊ฐ ํ๋ ๋๋ ๋๋ง๋ค Repository๋ฅผ Clear ์์ผ์ฃผ๊ธฐ ์ํ ์ฝ๋ (MemoryMemberRepositoryTest์ afterEach()์์ ํธ์ถ)
public void clearStore() {
store.clear();
}
} // Class ๋
๐ก ์ฐธ๊ณ
Test๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๋ฉฐ, ํ ์คํธ ์์์ ์์กด๊ด๊ณ๊ฐ ์๋ ๊ฒ์ ์ข์ง ์์ Test
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] Spring Bean๊ณผ ์์กด๊ด๊ณ (0) | 2021.08.12 |
---|---|
[Spring Boot] Service ๊ฐ๋ฐ ๋ฐ Test Case ์์ฑ (0) | 2021.08.11 |
[Spring Boot] Spring Web ๊ฐ๋ฐ ๊ธฐ์ด (0) | 2021.08.05 |
[Spring Boot] thymeleaf์ Spring Boot (2) | 2021.08.04 |
Lombok Annotation ๊ด๋ จ (0) | 2021.06.17 |