728x90
λ°μν
π νμ κ΄λ¦¬ μμ (Annotation μ¬μ©X)
1. λΉμ¦λμ€ μꡬμ¬ν μ 리
- λ°μ΄ν° : νμ ID, μ΄λ¦
- κΈ°λ₯ : νμ λ±λ‘, μ‘°ν
- μμ§ λ°μ΄ν° μ μ₯μκ° μ μ λμ§ μμ(κ°μμ μλ리μ€)
- μΈν°νμ΄μ€λ‘ ꡬν ν΄λμ€λ₯Ό λ³κ²½ν μ μλλ‘ μ€κ³, λ€μν μ μ₯μλ₯Ό κ³ λ―Όμ€μΈ μν©μΌλ‘ κ°μ
2. νμ λλ©μΈκ³Ό λ ν¬μ§ν 리 κ°λ°
νμ κ°μ²΄
package hello.hellospring.domain;
public class Member {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- get, set λ©μλλ₯Ό μ¬μ©νλ μ΄μ : κ°μ²΄μ μΊ‘μνλ₯Ό μ μ§νλ©΄μλ ν΄λμ€ μΈλΆμμ κ°μ²΄μ νλ κ°μ μ κ·Όνκ±°λ μμ ν μ μλλ‘ νκΈ° μν¨
νμ λ ν¬μ§ν 리 μΈν°νμ΄μ€
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
- Optional<> : https://geniebox.tistory.com/202
νμ λ ν¬μ§ν 리 λ©λͺ¨λ¦¬ ꡬν체
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
/**
* λμμ± λ¬Έμ κ° κ³ λ €λμ΄ μμ§ μμ, μ€λ¬΄μμλ ConcurrentHashMap, AtomicLong μ¬μ© κ³ λ €
*/
public class MemoryMemberRepository implements MemberRepository {
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;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
public void clearStore() {
store.clear();
}
}
- Override : λΆλͺ¨ ν΄λμ€ λλ μΈν°νμ΄μ€μ μ μλ λ©μλλ₯Ό μμ ν΄λμ€μμ μ¬μ μνμ¬ κ΅¬ν λ΄μ©μ λ³κ²½νλ κ²
- Overloading : κ°μ ν΄λμ€μμ λ©μλ μ΄λ¦μ κ°μ§λ§ λ§€κ°λ³μ μκ·Έλμ²λ₯Ό λ€λ₯΄κ² μ μ
3. νμ μλΉμ€ κ°λ°
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
/**
* νμκ°μ
*/
public Long join(Member member) {
validateDuplicateMember(member); //μ€λ³΅ νμ κ²μ¦
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("μ΄λ―Έ μ‘΄μ¬νλ νμμ
λλ€.");
});
}
/**
* μ 체 νμ μ‘°ν
*/
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
ν μ€νΈ νκ²½μμ Mock κ°μ²΄λ₯Ό νμ©ν΄ μμ‘΄μ±μ λ체ν μ μκΈ° λλ¬Έμ ν μ€νΈ μ©μ΄μ±μ΄ ν¬κ² ν₯μλκΈ° μν΄ νμ μλΉμ€ μ½λλ₯Ό DI(μμ‘΄μ± μ£Όμ ) κ°λ₯νκ² λ³κ²½μ ν΄μ€λ€.
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
νμ μλΉμ€ ν μ€νΈ
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.
import static org.junit.jupiter.api.Assertions.
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
@Test
public void νμκ°μ
() throws Exception {
//Given
Member member = new Member();
member.setName("hello");
//When
Long saveId = memberService.join(member);
//Then
Member findMember = memberRepository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
}
@Test
public void μ€λ³΅_νμ_μμΈ() throws Exception {
//Given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//When
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2));//μμΈκ° λ°μν΄μΌ νλ€.
assertThat(e.getMessage()).isEqualTo("μ΄λ―Έ μ‘΄μ¬νλ νμμ
λλ€.");
}
}
- BeforeEach :
- κ°κ°μ ν μ€νΈ λ©μλκ° μ€νλκΈ° μ μ μ€νλλ λ©μλλ₯Ό μ μνλ€.
- μ£Όλ‘ ν μ€νΈμ νμν μ΄κΈ°ν μμ (μ: κ°μ²΄ μμ±, λ°μ΄ν° μ€μ λ±)μ μννλ€.
- μ¬λ¬ ν μ€νΈ λ©μλμμ λμΌν μ΄κΈ°ν μ½λκ° νμν κ²½μ° μ€λ³΅μ λ°©μ§ν μ μλ€.
- ν μ€νΈκ° μλ‘ μν₯μ΄ μλλ‘ νμ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νκ³ , μμ‘΄κ΄κ³λ μλ‘ λ§Ίμ΄μ€λ€.
- AfterEach :
- κ°κ°μ ν μ€νΈ λ©μλκ° μ€νλ νμ μ€νλλ λ©μλλ₯Ό μ μνλ€.
- μ£Όλ‘ ν μ€νΈ νκ²½μ μ 리νκ±°λ 리μμ€λ₯Ό ν΄μ νλ λ° μ¬μ©νλ€.
- νλ²μ μ¬λ¬ ν μ€νΈλ₯Ό μ€ννλ©΄ λ©λͺ¨λ¦¬ DBμ μ§μ ν μ€νΈμ κ²°κ³Όκ° λ¨μ μ μλ€. μ΄λ κ²λλ©΄ λ€μ μ΄μ ν μ€νΈ λλ¬Έμ λ€μ ν μ€νΈκ° μ€ν¨ν κ°λ₯μ±μ΄ μλ€.`@AfterEach` λ₯Ό μ¬μ©νλ©΄ κ° ν μ€νΈκ° μ’ λ£λ λ λ§λ€ μ΄ κΈ°λ₯μ μ€ννλ€. μ¬κΈ°μλ λ©λͺ¨λ¦¬ DBμ μ μ₯λ λ°μ΄ν°λ₯Ό μμ νλ€.
- ν μ€νΈλ κ°κ° λ 립μ μΌλ‘ μ€νλμ΄μΌ νλ€. ν μ€νΈ μμμ μμ‘΄κ΄κ³κ° μλ κ²μ μ’μ ν μ€νΈκ° μλλ€.
- μλ₯Ό λ€μ΄, λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ λ«κ±°λ, μμ λ°μ΄ν°λ₯Ό μμ νκ±°λ, μνλ₯Ό μ΄κΈ°ννλ μμ μ μνν μ μλ€.
728x90
λ°μν
'π Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Spring] MVC ν¨ν΄μ΄λ? (0) | 2024.12.06 |
---|---|
[Spring] CRUD - Controller κ³΅λΆ (0) | 2024.12.05 |
[Spring] Spring MVC ꡬ쑰 (0) | 2024.12.02 |
[Spring] Spring Annotation 1 (0) | 2024.11.18 |
[Spring] .toEntity() .toList() .toString()μ΄λ? (0) | 2024.11.05 |