-정영한님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술'로 공부중입니다.
Spring을 활용해 회원가입 사이트를 구현해 보려고 한다. 무언가를 개발하기 위해서는, 기본적으로 구상을 해야하는데, 틀을 잡아가는 과정으로, 비즈니스 요구사항 작성, 웹 어플리케이션 계층 작성, 클래스 의존관계 결정 등을 해야 한다.
만들고자 하는 제품은 무엇을 위해 만드는 것인지, 사용자에게 어떠한 이익을 제공하고자 하는지 결정하는 부분으로, 우리는 개발에 관한 비즈니스 요구 사항을 작성할 것이므로, 사용자에게 제공할 기능과 그 기능을 수행하기 위한 데이터 등을 작성하는 것으로 한다.

각각의 MVC 같은 만들고자하는 부분들의 계층을 작성하는 부분이다.

클래스 간의 관계중 하나인 의존은 클래스 레퍼런스를 전달받았을 때 형성되는 관계로서 매개변수로 전달된 클래스 레퍼런스의 API 중 일부를 호출할 수 있고, 매개변수로 전달된 클래스가 변경된다면 받은 클래스에도 영향을 끼칠 수 있다는 것을 의미한다. 즉, 각 클래스 간의 관계를 나타내는 것이라고 생각하면 된다.
기본이 되는 회원의 클래스를 만들어주는 과정이다. 회원 클래스의 데이터로는 비즈니스 요구사항에 기입한대로, 회원 ID, 이름을 저장하도록 만들어주었다.
//도메인 패키지를 생성하고, 만들어준다.
public class Member {
private Long id; //회원의 id 저장
private String name; //회원의 이름 저장
//getter, setter 지정.
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
인터페이스를 먼저 생성하고, 구현하는 과정을 가질 것이다. 자바에서 인터페이스는 쉽게 말해서 있어야하는 최소한의 상수나 함수를 정의해 두는 것이다. 인터페이스를 사용하는 이유는 다형성과 유연성, 모듈화 때문이다. 그로인해 다수의 개발자들이 개발하는 프로젝트에서 충돌이 적어질 수 있도록 한다.
//리포지토리 패키지에 생성.
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();
}
인터페이스에서 save, findById, findByName, findAll의 자료형을 선언해준다.
import java.util.ArrayList;
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<>();
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 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();
}
}
인터페이스에서 선언해둔 함수를 오버라이딩해서 구현한 모습이다.
여기까지, 사이트를 만드는데 필요한 것들을 작성하고, 그 중에서 회원과 리포지토리를 만들었다. 다음에는 나머지 구현과 테스트하는 과정을 작성할 것이다.