[Spring_4기 본캠프] Spring 입문 - 백엔드 개발 | Day 31
1. Spring 이틀 차, 소감은?
- 강의에서 입력하는 코드를 그대로 따라 치고, 웹페이지가 변한 모습을 보면 신기해하고 그러고 있다.
내가 지금 뭘 하는건지, 이해를 하고 있는건지 알 수 없었다. 배우는 느낌이 아니라고 해야할까?
2. 회원 관리 서비스를 개발해보자
1) 비즈니스 요구사항 정리
- 데이터 : 회원ID, 이름
- 기능 : 회원 등록, 조회
- 데이터 저장소 미정 (가상의 시나리오)
→ 아직 데이터 저장소가 선정되지 않아 인터페이스로 구현클래스를 변경할 수 있도록 설계
→ 데이터 저장소는 RDB, NoSQL 등 다양한 저장소를 고민중인 상황으로 가정
→ 개발을 진행하기 위해 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용
- 컨트롤러 : 웹 MVC의 컨트롤러 역할
- 서비스 : 핵심 비즈니스 로직 구현
- 레포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
- 도메인 : 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등 주로 데이터베이스에 저장하고 관리됨.
< 기본 구조 코드 ↓ >
package hello.hello_spring.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;
}
}
package hello.hello_spring.repository;
import hello.hello_spring.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();
}
package hello.hello_spring.repository;
import hello.hello_spring.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); //sequence 값 올려주기 -> 가입한 순서대로 id값을 지정
store.put(member.getId(), member); // save하기 전 name은 이미 넘어온 상태. 이후 store에 넣기 전에 member의 id값을 세팅해주고, name은 회원가입 할 때 회원이 적는 이름
return member;
}
@Override
public Optional<Member> findById(Long id) { //store에 저장했을 때 id를 기준으로 정보를 찾는다.
return Optional.ofNullable(store.get(id)); //store에서 id를 가져오는데 가져오는 값이 null일 때 클라이언트에서 무언가를 할 수 있다(?)
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name)) // 루프를 돌면서 member.getName이 파라미터로 넘어온 name과 같으면 그 정보를 가져온다.
.findAny(); // 하나라도 일치하면 반환해라. 찾았는데 없으면 null이 반환됨
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values()); //멤버들이 리스트로 반환된다
}
}
우선 비즈니스 요구사항을 충족하기 위해 회원의 정보를 저장하고 관리하는 프로그램을 작성했다.
강의 코드를 따라치면서 내가 지금 뭘 입력하는걸까 무슨 기능을 구현하려는 걸까 궁금해졌다.
강의에서는 하나하나 설명해주지는 않아서 동료들한테 물어가면서 각 코드가 의미하는 것이 무엇이고, 뭘 하려고 이렇게 적는지 알아냈다.
우선 인터페이스로 멤버 레포지토리를 구현한 것은 아직 데이터 베이스를 지정하지 않았다는 가정이 있었기에,
나중에 데이터 베이스를 결정하고 나면 코드의 수정 없이 인터페이스만 DB로 갈아끼워주기 위해서이다.
정신없이 적어 정리가 되진 않았지만 복습을 위해 코드마다 그 의미를 해석해 주석으로 달아놨다.. 스프링은 정말 어렵다.
어쨋든 이젠 콘솔 기반이 아니라 GUI 기반으로 넘어가는 길목에 서있다는 것이다.
머릿속에 수많은 지식들이 떠돌아다니는 상태라 횡설수설하지만 어쨋든 얼른 작동 원리를 깨우쳐서 뭔가를 만들어보고싶다!