[프로젝트] 인스타그램(2) - 로그인 구현하기
다른 페이지
https://sjj02055.github.io/projects/instagram_1/
실행 환경
Intellij, Oracle
사용 Tools
SpringBoot, Thymeleaf, Lombok, json-simple, JPA
인스타그램 - 로그인기능 구현과정
@Entity
@Getter @Setter
public class Member {
@GeneratedValue
@Column(name="member_id")
@Id
private Long id;
private String nickname;
private String userId;
private String password;
private String name;
private int year,month,day;
private String profile_photo;
private String introduce;
}
DB에 사용자의 정보를 저장하기 위해 Member 객체를 구현.
@GetMapping("/login")
public String loginForm(@ModelAttribute("loginForm")loginForm form){
return "member/loginMember";
}
@PostMapping("/login")
public String login(@Valid @ModelAttribute loginForm form, BindingResult bindingResult, HttpServletRequest request){
if(bindingResult.hasErrors()){
return "member/loginMember";
}
Member loginMember = memberService.login(form.getUserId(), form.getPassword());
if(loginMember==null){
bindingResult.reject("loginFail","아이디 또는 비밀번호가 맞지 않습니다.");
return "member/loginMember";
}
//로그인 성공 처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
HttpSession session = request.getSession();
//세션에 로그인 정보 보관
session.setAttribute("loginMember", loginMember);
return "redirect:/";
}
예전에는 model을 변수로 지정해서 model.addattribute를 썼지만 @ModelAttribute 어노테이션을 쓴 뒤로 내부에 따로 추가하지 않아도 되서 상당히 편하다. BingdingResult를 통해 오류가 있으면 다시 원래 페이지로 복구 시키면 끝.
@Service
@Slf4j
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
private final MemberInterfaceRepository memberInterfaceRepository;
public Member login(String userId, String password){
Member findMember = memberRepository.findOneByUserId(userId)
.filter(m -> m.getPassword().equals(password))
.orElse(null);
if(findMember.getPassword().equals(password)){
return findMember;
}
else{
return null;
}
}
}
@Repository
@RequiredArgsConstructor
@Slf4j
public class MemberRepository {
//userId를 통해 한명 찾아오기
public Optional<Member> findOneByUserId(String userId){
return findAll().stream()
.filter(m ->m.getUserId().equals(userId))
.findFirst();
}
}
service는 @Transaction (readOnly=true)로 설정해 놓아 영속성 컨텍스트에 영향을 받지 않아 스냅샷 감지, 변경감지 수행을 하지 않아 성능 향상에 도움을 준다. CUD는 무조건 Repository에서!
@Data
@Getter @Setter
public class loginForm {
@NotBlank(message = "아이디를 입력해주세요")
private String userId;
@NotBlank(message = "비밀번호를 입력해주세요")
private String password;
}
후기
로그인 기능을 구현했으니 다음에는 회원가입 기능을 구현해보자. 지금 보면 필요 없어보이는 것도 있는 것 같지만.. 과거의 행적을 그대로 남겨두는 것도 좋겠지