회원 관리 예제
#비지니스 요구사항 정리
- 컨트롤러(Controller) 계층:
- 표현 계층과 응용 계층 사이에서 위치하며, 사용자의 입력을 받아 응용 계층으로 전달하거나 응용 계층에서 받은 데이터를 표현 계층에 전달하는 역할
- 주로 사용자 인터페이스와 상호작용하면서 해당 요청을 처리하고 응용 계층에 전달하여 비즈니스 로직을 수행
- 서비스(Service) 계층:
- 응용 계층과 데이터 계층 사이에서 비즈니스 로직을 처리하는 계층
- 응용 계층에서 필요한 기능을 제공하고, 트랜잭션 관리, 보안, 로깅 등의 부가적인 기능을 담당
- 여러 컨트롤러에서 공통으로 사용되는 로직을 추상화하여 재사용성을 높일 수 있음.
- 리포지토리(Repository) 계층:
- 데이터 계층과 도메인 계층 사이에서 위치하며, 데이터베이스와의 상호작용을 캡슐화\
- 데이터를 영속적으로 저장하고 검색하는 등의 데이터 액세스 기능을 제공
- 도메인 객체와 데이터베이스 간의 매핑을 담당하며, 데이터베이스에 대한 구체적인 구현 세부사항을 캡슐화
- 도메인(Domain) 계층:
- 응용 계층에서 처리된 비즈니스 로직을 구현하는 핵심 계층으로, 시스템의 핵심 도메인 로직을 포함
- 도메인 객체들이 존재하며, 이들은 시스템이 다루는 주요 개념이나 엔터티를 나타냄
- 비즈니스 규칙을 포함하고 해당 도메인의 핵심 역할을 수행
- 데이터베이스(DB) 계층:
- 데이터의 영속적인 저장을 담당하는 계층으로, 실제 데이터베이스 시스템과의 상호작용을 다룸
- 데이터의 저장, 조회, 갱신, 삭제 등을 처리하며, 주로 리포지토리 계층에서 호출
#회원 객체
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;
} }
- 패키지 선언:
- hello.hellospring.domain 패키지에 Member 클래스가 속해 있음을 나타냄
- . 클래스 선언:
- Member 클래스를 선언.
- 멤버 변수:
- private Long id;: 회원의 고유 식별자를 저장하는 변수
- private String name;: 회원의 이름을 저장하는 변수
- Getter 및 Setter 메소드:
- public Long getId() { return id; }: 회원의 고유 식별자를 반환하는 Getter 메소드
- public void setId(Long id) { this.id = id; }: 회원의 고유 식별자를 설정하는 Setter 메소드
- public String getName() { return name; }: 회원의 이름을 반환하는 Getter 메소드
- public void setName(String name) { this.name = name; }: 회원의 이름을 설정하는 Setter 메소드
이 Member 클래스는 주로 데이터를 담는 용도로 사용되며, MemoryMemberRepository 등과 같은 데이터 저장소와 함께 사용되어 회원 정보를 메모리나 데이터베이스에 저장하고 관리. 이 클래스의 구조는 간단하며, 프로젝트의 요구사항에 따라 추가적인 필드나 메소드를 포함시킬 수 있음.
# 회원 리포지토리 인터페이스
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();
}
- 패키지 선언:
- hello.hellospring.repository 패키지에 MemberRepository 인터페이스가 속해 있음.
- Import 문:
- hello.hellospring.domain.Member, java.util.List, java.util.Optional을 사용하기 위한 import
- 인터페이스 선언:
- MemberRepository 인터페이스를 선언
- 메소드 선언:
- Member save(Member member);: 회원 정보를 저장하는 메소드로, 회원 객체를 전달받아 저장하고 저장된 회원 객체를 반환
- Optional<Member> findById(Long id);: 주어진 ID에 해당하는 회원을 찾아 Optional 객체로 반환. 만일 찾는 회원이 없다면 Optional.empty()를 반환
- Optional<Member> findByName(String name);: 주어진 이름에 해당하는 회원을 찾아 Optional 객체로 반환. 동일한 이름의 회원이 여러 명일 수 있으므로, 일치하는 회원이 여러 명인 경우 그 중 어떤 회원을 반환할지는 정의되어 있지 않음
- List<Member> findAll();: 저장된 모든 회원 목록을 List로 반환
#회원 리포지토리 메모리 구현체
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
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();
} }
- 패키지 선언:
- hello.hellospring.repository 패키지에 클래스가 속해 있음을 나타냄
- Import 문:
- 다른 클래스나 패키지를 사용하기 위한 import 문
- hello.hellospring.domain.Member와 java.util.* 패키지를 import
- 클래스 선언:
- MemoryMemberRepository 클래스를 선언
- 이 클래스는 MemberRepository 인터페이스를 구현
- 멤버 변수:
- private static Map<Long, Member> store = new HashMap<>();: Member 객체를 저장하는 Map. 회원 정보를 메모리에 저장하기 위해 사용
- private static long sequence = 0L;: 회원의 고유 ID를 생성하기 위한 변수
- 메소드 구현:
- save: 회원 정보를 저장하는 메소드로, 회원 객체의 ID를 증가시키고 Map에 저장한 후 해당 회원 객체를 반환
- findById: 주어진 ID에 해당하는 회원을 찾아 Optional 객체로 반환
- findAll: 저장된 모든 회원 목록을 List로 반환
- findByName: 주어진 이름에 해당하는 회원을 찾아 Optional 객체로 반환
- clearStore: 저장된 모든 회원 정보를 삭제하는 메소드
'공부 > Backend' 카테고리의 다른 글
Spring Boot (0) | 2024.01.06 |
---|---|
Spring boot 3장 (0) | 2023.12.30 |
SQL 레벨업 9장 , 10장 (2) | 2023.12.02 |
SQL 레벨업 - 8장 (1) | 2023.11.25 |
SQL 레벨업 - 7장 (1) | 2023.11.18 |