1. 비즈니스 요구사항 정리
- 데이터 : 회원ID, 이름
- 기능 : 회원 등록 + 조회
컨트롤러 : 웹 MVC의 컨트롤러 역할
서비스 : 핵심 비지니스 로직 구현
도메인 : 회원, 주문 쿠폰처럼 데이터 베이스에 저장되고 관리되는 비즈니스 도메인 객체
리포지토리 : 이 비즈니스 도메인 객체를 DB에 저장하고 관리
인터페이스는 추후 데이터 저장소가 선정되었을 경우 구현 클래스를 변경하기 위해 설계
- MVC(Model, View, Controller) : 소프트웨어 디자인 패턴이다. 백그라운드에서 동작하는 로직을 처리하는 Model, 사용자가 보게 될 화면을 출력하는 View, 사용자의 입력 처리와 흐름을 제어하는 Controller로 구성된다.
- 모델1 : 사용자의 요청을 JSP가 전부 다 처리한다. jsp란 JavaServerPage, HTML 내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지지를 생성해 웹 브라우저에 돌려주는 언어이다.
- 모델 2: 사용자의 요청을 서블릿*이 받는다. 서블릿은 이 요청을 받고 VIew로 보여줄지 Model로 보내줄 지 결정하여 전송한다. HTML과 Java코드가 분리된 것이 특징이다.
* 서블릿 : 자바 클래스의 일종, JSP가 HTML문서 안에 Java 코드를 포함하고 있는 것과 다르게 서블릿은 자바 코드 안에 HTML을 담고 있다.
2. 회원 도메인과 리포지토리 만들기
package com.gamja.gamja.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;
}
}
요구사항에 id와 name이 있으므로 두가지 변수를 지정해준다. 그리고 getter setter메소드를 통해 이 멤버 변수에 대한 read/write를 처리한다. 이때 클래스의 변수는 private형으로 구현한다. getter setter은 new 생성자와 다르게 멤버 변수를 보호해주는 역할을 한다.
만들어진 domain을 이용해서 MemberRepository 인터페이스를 생성한다.
package com.gamja.gamja.repository;
import com.gamja.gamja.domain.Member;
import java.util.List;
import java.util.Optional;
// NULL을 처리하기 위해 Optional을 사용
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id); //id로 회원을 찾는 코드
Optional<Member> findByName(String name); //name으로 회원을 찾는 코드
List<Member> findAll(); //findALl();을 호출하면 지금까지 저장된 회원의 리스트를 반환
}
인터페이스에서는 구현체에서 어떤 동작을 할지 선언?하는 느낌으로 코드를 작성한다.
package com.gamja.gamja.repository;
import com.gamja.gamja.domain.Member;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
//회원ID의 데이터 타입이 Long, 값이 Member
private static long sequence = 0L; //sequence를 초기화시켜줌
@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 Optional<Member> findByName(String name) {
return store.values().stream().filter(member ->member.getName().equals(name)).findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore(){
store.clear();
}
}
//MemberRepository 인터페이스의 구현체
회원 리포지토리 메모리 구현체를 만들어준다.
* Shift + Enter로 인터페이스의 methods를 한번에 불러올 수 있다.
① save 메소드 : 저장할 공간을 생성하기 위해 Map을 사용한다. 회원 ID의 자료형 Long과 값 Member을 넣어준다.
② findById, findByName 메소드 : 해당하는 id와 name만을 반환하는 메소드
③ findAll() : 모든 객체를 반환하는 메소드
3. 회원 리포지토리 테스트 케이스
생략
4. 회원 서비스 개발
package com.gamja.gamja.service;
import com.gamja.gamja.domain.Member;
import com.gamja.gamja.repository.MemberRepository;
import com.gamja.gamja.repository.MemoryMemberRepository;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
public Long join(Member member) {
//중복회원 제거
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m -> {
throw new IllegalAccessException("이미 존재하는 회원입니다. ");
});
memberRepository.save(member);
return member.getId(); // id만 반환해주겠다!
}
}
여기서 사용한 핵심 비즈니스 로직은 중복 회원을 제거하는 것이다.
'Framework > Spring' 카테고리의 다른 글
스프링 복습 및 기초 다지기 (0) | 2021.02.05 |
---|---|
인프런 스프링 입문 강의 #JPA (0) | 2021.02.02 |
인프런 스프링 입문 강의 #데이터베이스 (0) | 2021.01.29 |
인프런 스프링 입문 강의 #웹 MVC 개발 (0) | 2021.01.28 |
IntelliJ 단축키 정리 (0) | 2021.01.28 |