728x90
반응형
# 예제 게시판으로 개발하고 있는 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);
}
- 끝 -
728x90
반응형
'🌱JAVA > 시나리오 개발' 카테고리의 다른 글
<SpringBoot> DB 변경하기 H2 → Postgresql (2) | 2023.04.28 |
---|---|
<SpringBoot> 게시판에 검색 기능 구현하기 (0) | 2023.04.28 |
<SpringBoot> Swagger 적용해보기 (0) | 2023.04.27 |
<SpringBoot> insert2개 수행, 1개는 그냥 insert, 1개는 Admin 붙여서 insert (0) | 2023.04.27 |
<SpringBoot> 댓글이 있는 게시글 삭제 시 오류 메세지 출력 및 게시글 삭제하기 (0) | 2023.04.27 |