한동안 여러 시험과 코테들을 보느라 바쁜 나날들을 보내고 있다.🥲 따로 포스팅할 기회가 있으면 좋을 것 같은데 한 가지 좋은 소식으로는 지난달 프로그래머스 백엔드 데브코스를 지원했던 것의 코딩테스트 결과가 나왔다. 결과는 합격!🎉 그리고 지금은 면접까지 본 상태이다. 아마 내일 중으로 결과가 나올 듯 한데, 잘은 모르겠다... 그냥 일단은 기다려보고 있는 상태이다.
개인 프로젝트를 그동안 너무 소홀히 했는데, 일단은 간단한 기능, 그리고 전부터 수정하기 원했던 기능을 손보는 시간을 가졌다.
관리자 회원가입 기능은 사실 구현해놓았었다. 그러나, 한 가지 Role
을 코드상에서만 변경해서 회원가입을 해야한다는게 좀 아쉬웠다. 무슨 말이냐하면...
Member.java
package com.shop.entity;
import com.shop.constant.Role;
import com.shop.dto.MemberFormDto;
import lombok.*;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.persistence.*;
public class Member extends BaseEntity{
// ...(중간 생략)
public static Member createMember(MemberFormDto memberFormDto,
PasswordEncoder passwordEncoder) {
Member member = new Member();
member.setName(memberFormDto.getName());
member.setEmail(memberFormDto.getEmail());
member.setAddress(memberFormDto.getAddress());
String password = passwordEncoder.encode(memberFormDto.getPassword()); // 스프링 시큐리티 설정 클래스에 등록한 BCryptPasswordEncoder Bean을 파라미터로 넘겨서 비밀번호 암호화
member.setPassword(password);
member.setRole(Role.USER); // Role 설정
return member;
}
이처럼 createMember
로 new Member
를 생성하게 되면 무조건 Role
권한이 USER
인 회원으로만 회원가입이 될 것이다. 관리자(admin)로 회원가입을 하고 싶을때는 createMember
메소드의 member.setRole
을 Admin
으로 바꾸고, 일반 회원으로 가입하려면 Role
을 다시 USER
로 바꿔주어야한다. 번거롭기 짝이 없는 설정이다.
이를 웹 페이지 상에서 설정하여 코드를 수정할 필요 없이 저장되게 하고 싶었다.
이를 구현하기 위해 어떤 부분을 수정해야할지 생각했다. 결론은 하나..! 그냥 메소드 하나를 더 만드는 것. (간단해서 죄송합니다) createAdminMember
라는 메소드를 Member
클래스에 추가했다.
Member.java
package com.shop.entity;
import com.shop.constant.Role;
import com.shop.dto.MemberFormDto;
import lombok.*;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.persistence.*;
public class Member extends BaseEntity{
// ...(중간 생략)
public static Member createAdminMember(MemberFormDto memberFormDto,
PasswordEncoder passwordEncoder) {
Member member = new Member();
member.setName(memberFormDto.getName());
member.setEmail(memberFormDto.getEmail());
member.setAddress(memberFormDto.getAddress());
String password = passwordEncoder.encode(memberFormDto.getPassword()); // 스프링 시큐리티 설정 클래스에 등록한 BCryptPasswordEncoder Bean을 파라미터로 넘겨서 비밀번호 암호화
member.setPassword(password);
member.setRole(Role.ADMIN); // Role 설정
return member;
}
메소드를 ADMIN
으로 설정했기 때문에 이제 이 메소드를 통해 생성된 회원은 권한이 관리자가 될 것이다.
이제 통로를 만들 차례이다.
MemberController.java
package com.shop.controller;
// (..import 생략)
@RequestMapping("/members")
@Controller
@RequiredArgsConstructor
public class MemberController {
// (...코드 생략)
@GetMapping(value = "/newAdmin")
public String adminMemberForm(Model model) {
model.addAttribute("memberFormDto", new MemberFormDto());
return "member/memberForm";
}
@PostMapping(value = "/newAdmin")
public String newAdminMember(@Valid MemberFormDto memberFormDto, // 검증하려는 객체의 앞에 @Valid 어노테이션을 선언하고, 파라미터로 bindingResult 객체 추가
BindingResult bindingResult, Model model) { // 검사 후 결과는 bindingResult에 담아줌.
if(bindingResult.hasErrors()) { // 에러가 있다면 회원 가입 페이지로 이동
return "member/memberForm";
}
try {
Member member = Member.createAdminMember(memberFormDto, passwordEncoder);
memberService.saveMember(member);
} catch (IllegalStateException e) {
model.addAttribute("errorMessage", e.getMessage()); // 회원 가입 시 중복 회원 가입 예외가 발생하면 에러 메시지를 뷰로 전달
return "member/memberForm";
}
return "redirect:/";
}
// (..코드 생략)
MemberController
에서 /newAdmin
으로 매핑된 주소로 접속하면 일반 회원의 회원가입 폼은 똑같이 주어지지만 Member.createAdminMember
즉, createAdminMember
메소드에 접근하여 save가 된다. 결과적으로 관리자 회원이 만들어지게 된다.
따로 관리자 회원 가입을 할 수 있도록 버튼을 만들었다. 버튼을 누르게 되면 미리 만들어놓은 /newAdmin
주소로 들어가게 된다.
관리자 회원가입 페이지로 접속하여 필수정보들을 입력하고 제출하기 버튼을 누르면
위와 같이 이메일 kjh1@naver.com 으로 회원가입한 회원은 상품등록과 상품관리 메뉴가 뜨는 것으로 보아 관리자로 회원가입이 잘 되었다.
이제 그냥 회원가입 버튼을 눌러서 회원가입을 해보자.
회원정보를 입력하고 제출하기 버튼을 누르면...
kjh2@naver.com 으로 가입한 계정은 장바구니와 구매이력만 볼 수 있다. 따라서 일반 회원으로 가입되었다는 것을 알 수 있다.