간단하게
@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 |