본문 바로가기
Spring/Spring Framework(Basic)

[Spring] 순수 자바 코드를 이용해 Service 구축하기 - 1

by 완두완두콩 2021. 10. 26.

스프링의 첫 걸음


단순히 스프링 기술을 사용하는 것만이 아닌 , 왜 사용하는지 , 어떠한 이점이 있어서 스프링 프레임워크(Spring Framework)를 사용하는지 알기 위해서는 직접 순수한 자바를 사용해 간단한 시스템을 구축해보고 이를 점진적으로

스프링으로 바꾸어 나가는 과정을 시작한다.

 

 

요구사항


회원

회원을 가입하고 조회할 수 있다.

회원은 일반과 VIP 두 가지 등급이 있다.

회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)

 

주문과 할인 정책

회원은 상품을 주문할 수 있다. 회원 등급에 따라 할인 정책을 적용할 수 있다.

할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있다.)

할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다.

최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정)

 

 

회원 클래스 다이어그램


 

<회원 다이어그램>

 

 

구현


* 필자는 인텔리제이를 이용하여 구현하였다.

 

1
2
3
4
5
6
7
8
package hello.core.member;
 
public enum Grade {
 
    BASIC,
    VIP
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package hello.core.member;
 
public class Member {
 
    private Long id;
    private String name;
    private Grade grade;
 
    public Member(Long id, String name, Grade grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }
 
    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;
    }
 
    public Grade getGrade() {
        return grade;
    }
 
    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}
 
cs

 

-> Enum (열거형)을 통해 Grade 에 관한 정보 정의. <VIP , BASIC>  // 이는 추후 할인정책에 사용할 것이다.

-> id, name , grade 를 변수로 갖는 Member 클래스 생성 // 앞으로 멤버 정보는 id , name , grade 로 관리한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
package hello.core.Repository;
 
import hello.core.member.Member;
 
public interface MemberRepository {
 
    void saveMember(Member member);
 
    Member findById(Long memberId);
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package hello.core.Repository;
 
import hello.core.member.Member;
 
import java.util.HashMap;
import java.util.Map;
 
public class MemoryMemberRepository implements MemberRepository{
 
    private static Map<Long , Member> store = new HashMap<>();
 
    @Override
    public void saveMember(Member member) {
        store.put(member.getId(), member);
    }
 
    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}
 
cs

 

-> MemberRepository Interface 생성. // 어떠한 저장소를 상속하느냐에 상관없이 저장(save)과 찾기(findById)기능 삽입

-> Map 과 HashMap :  Map 은 Collections Class 중 하나이다. Collections 란 유용한 알고리즘을 구현한 메소드들이다.

Map<Key, Value> 형태로 선언 /  key 객체의 해시값을 이용해서 꺼낸다 /  값을 중복 저장할 수 없다 / 같은 값을 다른 키로 저장하는 것은 가능하다.

HashMap 은 Map 컬랙션 클래스의 상속을 받는 여러 클래스들 중 하나이다.(HashMap , HashTable , TreeMap) 

put 과 get 메소드를 이용해 값을 저장하고 출력한다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
package hello.core.memberService;
 
import hello.core.member.Member;
 
public interface MemberService {
 
    void join(Member member);
 
    Member findMember(Long memberId);
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package hello.core.memberService;
 
import hello.core.Repository.MemberRepository;
import hello.core.Repository.MemoryMemberRepository;
import hello.core.member.Member;
 
public class MemberServiceImpl implements MemberService{
 
    MemberRepository memberRepository = new MemoryMemberRepository();
 
    @Override
    public void join(Member member) {
        memberRepository.saveMember(member);
    }
 
    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
 
cs

 

-> MemberRepository 는 저장소에 넣는 과정.  MemberService 는 회원가입을 누를시에 동작하는 개념.

-> MemberRepository 객체를 생성 후 , join 메소드를 실행 시 호출.

MemberService -> join 메소드 호출 -> MemberRepository -> save 메소드 호출.

두 단계로 진행된다.

MemberRepository memberRepository  = new MemoryMemberRepository();

<< 부모는 자식을 상속 가능하다. >> 앞으로도 부모를 선언 후 , 사용하고자 하는 객체 선언.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package hello.core.memberService;
 
import hello.core.Repository.MemberRepository;
import hello.core.Repository.MemoryMemberRepository;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
 
import static org.junit.jupiter.api.Assertions.*;
 
class MemberServiceTest {
 
    MemberService memberService = new MemberServiceImpl();
 
    @Test
    void join() {
        //given
        Member member = new Member(1L, "testA", Grade.VIP);
        //when
        memberService.join(member);
        Member findMember = memberService.findMember(1L);
        //then
        Assertions.assertThat(member).isEqualTo(findMember);
    }
}
cs

 

-> Join 테스트 구현

1L 을 id 로 하는 member 객체 생성 . Join 메소드 실행 후 , findMember 를 통해 1L 이 존재하는지 Assertions를 이용해 확인한다.

 

 

 

- 다음 장에서는 주문과 할인 정책을 개발해보도록 하겠다.

 

* 해당 글은 'Infleran'의 김영한 강사님의 자료를 참조하였습니다.

댓글