스프링/4. 스프링 MVC-2

44. 멤버 회원가입 구현

sdafdq 2023. 9. 4. 23:27

간단하게

 

@Data
public class Member {
    private Long id;

    @NotEmpty
    private String loginId;

    @NotEmpty
    private String name;
    @NotEmpty
    private String password;
}

검증 애노테이션 추가해 주고.

 

@Slf4j
@Repository
public class MemberRepository {
    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    public Member save(Member member){
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    public Member findById(Long id){
        return store.get(id);
    }


    public Optional<Member> findByLoginId(String loginId){
        return findAll().stream()
                .filter(m -> m.getLoginId().equals(loginId))
                .findFirst();
    }


    public List<Member> findAll(){
        return new ArrayList<>(store.values());
    }


    public void clearStore(){
        store.clear();
    }

}

테스트 용도로 메모리에 저장할 용도로 store 라는 Map을 하나 만들어 주고

시퀀스, 

 

save는 똑같고,

 

findByLoginId만 좀 특이해 보이는데,

findAll()은 ArrayList로 다 얻어오는 거고,

stream()이 원소들 하나 씩 순환하는거임.

 

filter는 말 그대로 걸러주는 기능, 람다식으로 표현 했다. 

각각의 원소를 m이라고 별칭짓고 m의 loginId와 인자로 들어온 loginId를 비교한다.

그중 첫번째 것을 찾으면 (그냥 찾자마자) 반환한다.

stream()은 Optional을 반환한다.

 

 

 

@Controller
@RequiredArgsConstructor
@RequestMapping("/members")
public class MemberController {


    private final MemberRepository memberRepository;

    @GetMapping("/add")
    public String addForm(@ModelAttribute Member member){
        return "members/addMemberForm";
    }

    @PostMapping("/add")
    public String save(@Validated @ModelAttribute Member member, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "members/addMemberForm";
        }
        memberRepository.save(member);
        return "redirect:/";
    }
}

Get으로 들어온 요청은 그냥 Form 템플릿으로 보내버리고, 

Post로 들어온 건 검증을 한 후, 에러가 없다면 새로고침의 재요청 부작용을 막기 위해 PRG패턴, 그냥 Home으로 보내버린다.

 

 

'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글

46. 쿠키를 이용한 로그인 구현.  (0) 2023.09.05
45. 로그인 구현  (0) 2023.09.05
43. 도메인과 표현 분리  (0) 2023.09.04
42. Http 메시지(Rest API) 검증  (0) 2023.09.04
41. Form 전송객체 분리  (0) 2023.09.04