。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

강의/Spring

[Spring 입문] 3. 회원 도메인 개발

quarrrter 2023. 12. 11. 00:22

일반적인 웹 어플리케이션 구조

  • 컨트롤러: 웹 MVC의 컨트롤러 역할
  • 서비스: 핵심 비즈니스 로직 구현
  • 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

 

 


회원 객체

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;
    } 
  }

 

 

회원 레퍼지토리 인터페이스

=> db 접근하여 객체 관리

 public interface MemberRepository {
     Member save(Member member);
     Optional<Member> findById(Long id);
     Optional<Member> findByName(String name);
     List<Member> findAll();
}

 

회원 리포지토리 메모리 구현체 

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();
	} 
    }

 

Optional 사용

https://timi-d.tistory.com/323

 

Optional

Optional은 Java 8에서 도입된 클래스로, 값이 존재할 수도 있고 없을 수도 있는 컨테이너. 주로 NullPointerException을 방지하고자 할 때 사용 => null인지 아닌지, 안전하게 판단하고 싶어서. 검증을 확실

timi-d.tistory.com

 

회원 서비스 

=> 비지니스 로직

public class MemberService {
    private final MemberRepository memberRepository = new
	MemoryMemberRepository();

	* 회원가입 *
    public Long join(Member member) {
    validateDuplicateMember(member); //중복 회원 검증 
    memberRepository.save(member);
    return member.getId();
    }
    
    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
	.ifPresent(m -> {
	throw new IllegalStateException("이미 존재하는 회원입니다.");
	}); }

	* 전체 회원 조회 *
    public List<Member> findMembers() {
       return memberRepository.findAll();
	}
    
    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
	} 
  }