프로그래밍 끄적끄적
[SpringBoot] 스프링 입문 - 회원 관리 예제(비즈니스 요구사항 정리, 도메인, 리포지토리) 본문
* 웹 애플리케이션 계층 구조
일반적인 웹 애플리케이션 계층 구조는 아래의 그림과 같다.
서비스는 핵심 비즈니스 로직을 구현하는 부분이며,
리포지토리는 데이터베이스에 접근하는 부분으로 도메인 객체를 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 |
'백엔드 > 스프링' 카테고리의 다른 글
[SpringBoot] 스프링 입문 - 회원 관리 예제(서비스) (0) | 2021.07.28 |
---|---|
[SpringBoot] 스프링 입문 - 회원 관리 예제(테스트 케이스 작성-리포지토리 테스트) (0) | 2021.07.28 |
[SpringBoot] 스프링 입문 - 스프링 웹 개발 기초(정적 컨텐츠, MVC, 템플릿 엔진, API) (0) | 2021.07.25 |
[SpringBoot] 스프링 입문 - View 환경설정 (0) | 2021.07.23 |
Port 8080 was already in use 에러 (0) | 2021.07.21 |
Comments