<스프링을 이용한 간단한 회원가입 서비스 만들기>
본 포스팅은 스프링을 이용한 간단한 예제 프로젝트입니다.
1. 프로젝트 설계
일반적으로 웹 애플리케이션은 다음과 같은 형태를 가진다.
그리고 각 계층의 역할은 다음과 같다.
컨트롤러 | 웹 MVC구조에서 Controller의 역할을 담당한다. 클라이언트들이 요청할 엔드포인트(url)를 정의하고 받은 데이터를 서비스 계층에 넘겨주는 역할을 한다. |
서비스 | 애플리케이션의 핵심 비즈니스 로직이 구현되는 계층 |
리포지토리 | 데이터베이스에 접근 및 도메인 객체를 DB에 저장하고 관리하는 역할을 한다. |
도메인 | 데이터를 담고있는 객체라고 보면 될 것 같다. 회원, 주문, 쿠폰 등 주로 DB에 저장되고 관리되는 데이터들이며 일반적으로는 테이블에 매칭되는 개념이다. |
이번 예제 프로젝트에서는 다음과 같은 상황에 처해있다고 가정해보자.
- 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
- 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정
- 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용
따라서 다음과 같이 설계한다.
먼저 DB가 결정되지 않았지만 개발은 진행해야 하는 상황이다.
따라서 먼저 서비스 계층에서는 리포지토리의 인터페이스에 정의해놓은 메서드를 사용한 뒤 사용한다.
(서비스를 리포지토리의 인터페이스에 의존하면 추후에 DB가 결정되면 쉽게 교체가 가능해진다.)
2. 도메인 계층
도메인 계층 중 먼저 유저 계층을 먼저 설계한다.
@Getter @Setter
public class UserVO {
private Long id;
private String name;
}
간단하게 id와 이름을 등록하도록 한다.
3. 리포지토리 계층
리포지토리의 경우 저장, 조회기능만 간단하게 구현한다.
3-1) 인터페이스
public interface UserRepository {
UserVO save(UserVO userVO);
Optional<UserVO> findById(Long id);
Optional<UserVO> findByName(String name);
List<UserVO> findAll();
}
3-2) 메모리 리포지토리 구현체
메모리 리포지토리는 HashMap을 변수로 선언한 뒤 여기에 데이터들을 저장하도록 구현한다.
저장되는 도메인들의 키값(PK)을 결정하는 용도로 sequence를 두어 키값을 진행한다.
public class MemoryUserRepositoryImpl implements UserRepository {
Map<Long, UserVO> userMap = new HashMap<>();
private static long sequence=0L;
@Override
public UserVO save(UserVO userVO) {
userVO.setId(++sequence);
userMap.put(userVO.getId(), userVO);
return userVO;
}
@Override
public Optional<UserVO> findById(Long id) {
return Optional.ofNullable(userMap.get(id));
}
@Override
public Optional<UserVO> findByName(String name) {
return userMap.values().stream().filter(
u->u.getName().equals(name)
).findAny();
}
@Override
public List<UserVO> findAll() {
return new ArrayList<>(userMap.values());
}
}
Reference
이 포스팅은 아래의 강좌를 참고하여 만들어졌습니다.
- 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
'Backend > 게시판만들기' 카테고리의 다른 글
[Spring실습] 5분만에 알아보는 회원가입 서비스 만들기-3 (0) | 2020.11.30 |
---|---|
[Spring실습] 5분만에 알아보는 테스트 케이스 작성해보기-2 (0) | 2020.11.29 |
[SpringBoot]게시판 로그인 기능 제작 및 예제(Form데이터 Controller에서 받아서 처리하기) (2) | 2020.08.16 |
[SpringBoot]SpringDataJPA를 활용하여 회원가입 예제- Controller,Service,Repository의 역할및 구현 (3) | 2020.08.10 |
[SpringBoot]SpringDataJPA를 활용한 회원가입 예제- View제작하기 (0) | 2020.08.08 |