본문 바로가기

🌱JAVA/시나리오 개발

<SpringBoot> 로그인 및 회원가입 구현

# 예제 게시판으로 개발하고 있는 SpringBoot 프로젝트에 로그인 및 회원가입 구현하기

- 일단 구현된 기능과 화면을 보면 아래와 같다.

- mp4 버전은 아래와 같다.

# Login (로그인)

- 코드는 아래와 같다.

- Controller

LoginController

@Slf4j
@Controller
@Component
public class LoginController {
    @Autowired
    ArticleRepository articleRepository;
    @Autowired
    LoginRepository loginRepository;

    @Autowired
    MemberRepository memberRepository;

    @GetMapping("/login") //주소
    public String login() {

        return "login/login"; //화면
    }

    //    리스트 형태로 나오는 메인 화면이다.
    @PostMapping("/login/articles")
    public String index(LoginForm form, Model model,
                        HttpServletRequest request, HttpServletResponse response) throws IOException {
//        1. loginForm을 통해 입력된 값을 가져온다.
        int number = loginRepository.select_number() + 1; // pk값 만들기
        Login login_entity = form.toEntity();
        System.out.println(login_entity);
//        2. pk값과 form 값에 입력된 값을 각각 분리한다.
        long get_id = number; // pk값을 get_id로 선언
        String get_name = login_entity.getName(); // login id 값
        String get_pwd = login_entity.getPwd(); // login pwd 값
//        DB에서 조회한 값

        String get_name_member_db = memberRepository.get_name_db(get_name);
        String get_pwd_member_db = memberRepository.get_pwd_db(get_pwd);
//        3. 조회한 id값과 pwd 값이 일치하면 index 페이지로 리다이렉트

        if (get_name.equals(get_name_member_db) && get_pwd.equals(get_pwd_member_db)) {
            response.setContentType("text/html; charset=UTF-8"); // 보낼 때 한글 인코딩
            response.setCharacterEncoding("UTF-8"); // 받을 때 한글 인코딩
            PrintWriter out = response.getWriter();
            out.println("<script>alert('로그인 되었습니다.'); self.close();</script>");
            out.flush();

//            String value_id = "may9noy"; //DB에서 사용자 조회 후 가져와서 Header에 넣어준다.
//            value_id(model, value_id);

            List<Article> articleEntityList = articleRepository.findAll();
            model.addAttribute("articleList", articleEntityList);
            return "/articles/index";
        } else {
            response.setContentType("text/html; charset=UTF-8"); // 보낼 때 한글 인코딩
            response.setCharacterEncoding("UTF-8"); // 받을 때 한글 인코딩
            PrintWriter out = response.getWriter();
            out.println("<script>alert('아이디와 패스워드를 확인해주세요.'); self.close();</script>");
            out.flush();
            return "/login/login";
        }
    }

    public static String value_id(Model model, String value_id) {
        model.addAttribute("id_value", value_id);
        return "/layouts/header";
    }
}

- DTO

LoginForm

@AllArgsConstructor
@ToString
public class LoginForm {

    private Long id;
    private String name;
    private String pwd;

    public Login toEntity() {

        return new Login(id, name, pwd);
    }
}

- Entity

Login

@Entity //DB가 해당 객체를 인식 가능
@ToString
@AllArgsConstructor
@Getter
public class Login {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id를 자동생성하는 어노테이션!
    private Long id;

    @Column
    private String name;

    @Column
    private String pwd;

    public Long id() {

        return id;
    }

    public String name() {

        return name;
    }

    public String pwd() {

        return pwd;
    }
}

- Repository

LoginRepository

@Repository
public interface LoginRepository extends CrudRepository<Login, Long> {
    @Query(value = "SELECT id FROM login ORDER by id DESC limit 1", nativeQuery = true)
    int select_number();

    @Query(value = "select name from login where name = :get_name", nativeQuery = true)
    String get_name_db(@Param("get_name") String get_name);

    @Query(value = "select pwd from login where pwd = :get_pwd", nativeQuery = true)
    String get_pwd_db(@Param("get_pwd") String get_pwd);
}

# Member (회원가입)

- Controller

MemberController

@Slf4j
@Controller
@Component
public class MemberController {

    @Autowired
    MemberRepository memberRepository;

    @Autowired
    ArticleRepository articleRepository;

    @GetMapping("/member") //주소
    public String member() {

        return "member/member"; //화면
    }

    @PostMapping("/member/articles")
    public String member(MemberForm form, Model model,
                         HttpServletRequest request, HttpServletResponse response) throws IOException {
//        1. loginForm을 통해 입력된 값을 가져온다.
        int number = memberRepository.select_number() + 1; // pk값 만들기

        Member member_entity = form.toEntity();

//        2. pk값과 form 값에 입력된 값을 각각 분리한다.
        String get_name = member_entity.getName();
        System.out.println(get_name);
//        DB에서 조회한 값
        String get_name_db = memberRepository.get_name_db(get_name);
        System.out.println(get_name_db);
//        3. id 중복체크
        if (!get_name.equals(get_name_db)) {
//            4. id 중복체크 후 아이디가 없으면 form으로 받은 데이터를 DB에 저장한다.(회원가입 수행)
            memberRepository.member_insert(number, member_entity.name(), member_entity.pwd(), member_entity.email());
            response.setContentType("text/html; charset=UTF-8"); // 보낼 때 한글 인코딩
            response.setCharacterEncoding("UTF-8"); // 받을 때 한글 인코딩
            PrintWriter out = response.getWriter();
            out.println("<script>alert('회원 가입이 완료되었습니다.'); self.close();</script>");
            out.flush();
            return "/login/login";
        } else {
            response.setContentType("text/html; charset=UTF-8"); // 보낼 때 한글 인코딩
            response.setCharacterEncoding("UTF-8"); // 받을 때 한글 인코딩
            PrintWriter out = response.getWriter();
            out.println("<script>alert('중복된 아이디가 존재합니다.'); self.close();</script>");
            out.flush();
            return "/member/member";
        }
    }
}

- DTO

MemberForm

@AllArgsConstructor
@ToString
public class MemberForm {

    private Long id;
    private String name;
    private String pwd;
    private String email;

    public Member toEntity() {

        return new Member(id, name, pwd, email);
    }
}

- Entity

@Entity //DB가 해당 객체를 인식 가능
@ToString
@AllArgsConstructor
@Getter
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id를 자동생성하는 어노테이션!
    private Long id;

    @Column
    private String name;

    @Column
    private String pwd;

    @Column
    private String email;

    public Long id() {

        return id;
    }

    public String name() {

        return name;
    }

    public String pwd() {

        return pwd;
    }

    public String email() {

        return email;
    }
}

- Repository

@Repository
public interface MemberRepository extends CrudRepository<Member, Long> {
    @Query(value = "SELECT id FROM member ORDER by id DESC limit 1", nativeQuery = true)
    int select_number();

    //select * from (select name from member where name = :get_name) 부서 order by name desc limit 1;
    @Query(value = "select * from (select name from member where name = :get_name) 회원 order by name desc limit 1", nativeQuery = true)
    String get_name_db(@Param("get_name") String get_name);

    @Query(value = "select * from (select name from member where name = :get_pwd) 회원 order by name desc limit 1", nativeQuery = true)
    String get_pwd_db(@Param("get_pwd") String get_pwd);

    @Transactional
    @Modifying
    @Query(value = "insert into member (id, name, pwd, email) values (:id, :name, :pwd, :email)", nativeQuery = true)
    int member_insert(@Param("id") long id,
                      @Param("name") String name,
                      @Param("pwd") String pwd,
                      @Param("email") String email);
}

- 끝 -