Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

프로그래밍 끄적끄적

[SpringBoot] 스프링 입문 - 회원 관리 예제(비즈니스 요구사항 정리, 도메인, 리포지토리) 본문

백엔드/스프링

[SpringBoot] 스프링 입문 - 회원 관리 예제(비즈니스 요구사항 정리, 도메인, 리포지토리)

soeunkk 2021. 7. 28. 12:07

* 웹 애플리케이션 계층 구조

일반적인 웹 애플리케이션 계층 구조는 아래의 그림과 같다.

출처: 인프런-스프링 입문(김영한) 강의자료

서비스핵심 비즈니스 로직을 구현하는 부분이며,

리포지토리는 데이터베이스에 접근하는 부분으로 도메인 객체를 DB에 저장하고 관리한다.

도메인은 주로 데이터베이스에 저장하고 관리되는 비즈니스 도메인 객체이다.

 

* 회원 관리 예제의 비즈니스 요구사항 정리

- 데이터: 회원ID, 이름

- 기능: 회원 등록, 조회

- 아직 데이터 저장소가 선정되지 않음

 

* 도메인

회원ID와 이름을 등록하기 위한 객체로 Member를 작성한다. (getter, setter 생략)

1
2
3
4
5
6
public class Member {
 
    private Long id;
    private String name;
 
}
cs

 

* 리포지토리 

회원 관리 예제에서는 Member라는 도메인 객체를 데이터베이스에 저장하기 위해 MemberRepository 인터페이스와 MemoryMemberRepository 클래스를 작성한다.

MemberRepositry 인터페이스를 상속하여 MemoryMemberRepository를 작성하는 이유는 아직 데이터 저장소를 정하지 않았다는 가정 때문이다. 쉽게 구현 부분을 바꿀 수 있도록 인터페이스를 만들고, 데이터를 저장할 수 있는 가장 간단한 방법으로 메모리 기반 데이터 저장소를 사용한다.

1
2
3
4
5
6
7
8
public interface MemberRepository {
 
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
 
}
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
public class MemoryMemberRepository implements  MemberRepository {
    //현재 딱히 정해진 데이터베이스가 없다고 가정하고 HashMap 에 저장
    private static Map<Long,Member> store = new HashMap<>();
    private static long sequence = 0L;
 
    @Override
    public Member save(Member member) {
        member.setId(++sequence);   //id 세팅
        store.put(member.getId(),member);   //데이터 저장
        return member;
    }
 
    //id에 해당하는 Member 객체를 반환
    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));  //null 일 때도 오류가 없이 반환되도록 ofNullable() 메소드 사용
    }
 
    //name에 해당하는 Member 객체를 반환
    @Override
    public Optional<Member> findByName(String name) {
        //stream: 모든 데이터들을 돌림
        //filter: 조건을 기입
        //findAny: 조건에 만족하는 것을 0개 이상 찾음 (결과가 Optional 로 반환됨)
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }
 
    //저장소에 저장된 모든 Member 객체를 
    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}
cs

 

Comments