[프로젝트] 인스타그램(2) - 로그인 구현하기

1 분 소요

다른 페이지

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;

}

후기

로그인 기능을 구현했으니 다음에는 회원가입 기능을 구현해보자. 지금 보면 필요 없어보이는 것도 있는 것 같지만.. 과거의 행적을 그대로 남겨두는 것도 좋겠지

카테고리:

업데이트: