세션 관리
- 웹 개발을 하며 각각 세션 종류가 많아질 때마다 동일한 세션 메소드를 만들기 보다는 클래스를 만들어서 사용해보자
- 추상 클래스 AbstractHttpSession<T> 구현
이후 세션에 필요한 클래스(String, int 등 모든 제네릭 가능)를 만들어서 상속받아 사용하면 됨
public abstract class AbstractHttpSession<T> {
/**
* 세션에 사용되는 이름 (상속받은 클래스에서 세션에 사용될 이름을 가져오기 위함)
* @return
*/
protected abstract String name();
/**
* value를 세션에 저장
* @param value
*/
public void setAttribute(T value) {
getSession().setAttribute(name(), value);
}
/**
* 세션에 저장된 정보를 리턴
* @return
*/
@SuppressWarnings("unchecked")
public T getAttribute() {
return (T) getSession().getAttribute(name());
}
/**
* 세션에 저장된 정보를 삭제
*/
public void removeAttribute() {
getSession().removeAttribute(name());
}
/**
* 세션에 저장된 모든 정보 삭제 및 초기화
*/
public void invalidate() {
getSession().invalidate();
}
/**
* HttpSession 리턴
* @return
*/
protected HttpSession getSession() {
return getRequest().getSession();
}
/**
* HttpServletRequest 리턴
* @return
*/
protected HttpServletRequest getRequest() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
return ((ServletRequestAttributes) requestAttributes).getRequest();
}
return null;
}
}
- AbstractHttpSession을 상속받아 세션에 필요한 클래스인 HttpSessionMember와 HttpSessionNiceAuth 클래스 생성
추상 메소드인 name()을 오버라이드하여 SESSION_MEMBER와 SESSION_NICEAUTH라는 이름을 사용하도록 함
@Component
public class HttpSessionMember extends AbstractHttpSession<SessionMember> {
@Override
protected String name() {
return "SESSION_MEMBER";
}
}
@Component
public class HttpSessionNiceAuth extends AbstractHttpSession<SessionNiceAuth> {
@Override
protected String name() {
return "SESSION_NICEAUTH";
}
}
- SessionMember와 SessionNiceAuth에 사용할 수 있는 도메인 모델과 파라미터 모델 관련 코드를 작성
@Data
@Entity(name = "SessionMember")
public class SessionMember {
@Id
private String memberId;
private String name;
private String phoneNumber;
}
@Data
@Entity(name = "SessionNiceAuth")
public class SessionNiceAuth {
@Id
private String authId;
private String name;
private String phoneNumber;
}
@Data
public class MemberSaveParameter {
private String authId;
private String memberId;
private String name;
private String phoneNumber;
}
- 회원가입, 로그인, 회원 정보, 로그아웃을 할 수 있는 MemberController 클래스에 세션 관련 코드를 작성
@RequiredArgsConstructor
@Controller
public class MemberController {
private final HttpSessionMember httpSessionMember;
private final HttpSessionNiceAuth httpSessionNiceAuth;
@PostMapping("/niceauth/response")
@ResponseBody
public boolean niceAuthResponse(HttpServletRequest request) {
// 실명인증 성공해서 응답이 온 경우 예시
SessionNiceAuth niceAuth = new SessionNiceAuth();
// 인증받은 식별코드
niceAuth.setAuthId("3242213123213");
niceAuth.setPhoneNumber("01012341234");
niceAuth.setName("홍길동");
// 로그인 시 세션에 정보 저장
httpSessionNiceAuth.setAttribute(niceAuth);
return true;
}
@PostMapping("/member/signup/save")
@ResponseBody
public boolean signupSave(@RequestParam String memberId) {
// 회원가입 예시
SessionNiceAuth niceAuth = httpSessionNiceAuth.getAttribute();
// 보인인증이 안된 경우 예외처리
if (niceAuth == null) {
throw new RuntimeException("회원가입시 본인인증은 필수입니다.");
}
// DB에 저장될 정보 set (본인인증 정보까지)
MemberSaveParameter member = new MemberSaveParameter();
member.setAuthId(niceAuth.getAuthId());
member.setName(niceAuth.getName());
member.setPhoneNumber(niceAuth.getPhoneNumber());
member.setMemberId(memberId);
// 회원 DB에 저장 로직 처리 후
// 보인인증 세션 초기화
httpSessionNiceAuth.removeAttribute();
return true;
}
@PostMapping("/login")
@ResponseBody
public boolean login(@RequestParam String memberId) {
// DB 조회해서 실제 회원인 경우라고 가정하고 예시
SessionMember member = new SessionMember();
member.setMemberId(memberId);
// 로그인 시 세션에 정보 저장
httpSessionMember.setAttribute(member);
return true;
}
@GetMapping("/mypage/info")
public String info(Model model) {
// 세션에 저장된 정보
model.addAttribute("member", httpSessionMember.getAttribute());
return "/mypage/info";
}
@GetMapping("/logout")
public String logout() {
// 로그아웃 시 모든 세션 정보 삭제
httpSessionMember.invalidate();
return "redirect:/main";
}
}
'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
자바 스프링부트 활용 웹개발 실무용 - 목차 (0) | 2023.07.03 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] 컨트롤러에서 파라미터를 받는 방법들 (0) | 2022.09.02 |
[자바 스프링부트 활용 웹개발 실무용] 파일 업로드와 썸네일 생성 (0) | 2022.08.27 |
[자바 스프링부트 활용 웹개발 실무용] TypeHandler로 데이터 변환하기 (0) | 2022.08.20 |
[자바 스프링부트 활용 웹개발 실무용] cron으로 로컬, 개발, 운영 설정값 프로퍼티에 따른 스케줄러 사용 (0) | 2022.08.18 |
세션 관리
- 웹 개발을 하며 각각 세션 종류가 많아질 때마다 동일한 세션 메소드를 만들기 보다는 클래스를 만들어서 사용해보자
- 추상 클래스 AbstractHttpSession<T> 구현
이후 세션에 필요한 클래스(String, int 등 모든 제네릭 가능)를 만들어서 상속받아 사용하면 됨
public abstract class AbstractHttpSession<T> {
/**
* 세션에 사용되는 이름 (상속받은 클래스에서 세션에 사용될 이름을 가져오기 위함)
* @return
*/
protected abstract String name();
/**
* value를 세션에 저장
* @param value
*/
public void setAttribute(T value) {
getSession().setAttribute(name(), value);
}
/**
* 세션에 저장된 정보를 리턴
* @return
*/
@SuppressWarnings("unchecked")
public T getAttribute() {
return (T) getSession().getAttribute(name());
}
/**
* 세션에 저장된 정보를 삭제
*/
public void removeAttribute() {
getSession().removeAttribute(name());
}
/**
* 세션에 저장된 모든 정보 삭제 및 초기화
*/
public void invalidate() {
getSession().invalidate();
}
/**
* HttpSession 리턴
* @return
*/
protected HttpSession getSession() {
return getRequest().getSession();
}
/**
* HttpServletRequest 리턴
* @return
*/
protected HttpServletRequest getRequest() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
return ((ServletRequestAttributes) requestAttributes).getRequest();
}
return null;
}
}
- AbstractHttpSession을 상속받아 세션에 필요한 클래스인 HttpSessionMember와 HttpSessionNiceAuth 클래스 생성
추상 메소드인 name()을 오버라이드하여 SESSION_MEMBER와 SESSION_NICEAUTH라는 이름을 사용하도록 함
@Component
public class HttpSessionMember extends AbstractHttpSession<SessionMember> {
@Override
protected String name() {
return "SESSION_MEMBER";
}
}
@Component
public class HttpSessionNiceAuth extends AbstractHttpSession<SessionNiceAuth> {
@Override
protected String name() {
return "SESSION_NICEAUTH";
}
}
- SessionMember와 SessionNiceAuth에 사용할 수 있는 도메인 모델과 파라미터 모델 관련 코드를 작성
@Data
@Entity(name = "SessionMember")
public class SessionMember {
@Id
private String memberId;
private String name;
private String phoneNumber;
}
@Data
@Entity(name = "SessionNiceAuth")
public class SessionNiceAuth {
@Id
private String authId;
private String name;
private String phoneNumber;
}
@Data
public class MemberSaveParameter {
private String authId;
private String memberId;
private String name;
private String phoneNumber;
}
- 회원가입, 로그인, 회원 정보, 로그아웃을 할 수 있는 MemberController 클래스에 세션 관련 코드를 작성
@RequiredArgsConstructor
@Controller
public class MemberController {
private final HttpSessionMember httpSessionMember;
private final HttpSessionNiceAuth httpSessionNiceAuth;
@PostMapping("/niceauth/response")
@ResponseBody
public boolean niceAuthResponse(HttpServletRequest request) {
// 실명인증 성공해서 응답이 온 경우 예시
SessionNiceAuth niceAuth = new SessionNiceAuth();
// 인증받은 식별코드
niceAuth.setAuthId("3242213123213");
niceAuth.setPhoneNumber("01012341234");
niceAuth.setName("홍길동");
// 로그인 시 세션에 정보 저장
httpSessionNiceAuth.setAttribute(niceAuth);
return true;
}
@PostMapping("/member/signup/save")
@ResponseBody
public boolean signupSave(@RequestParam String memberId) {
// 회원가입 예시
SessionNiceAuth niceAuth = httpSessionNiceAuth.getAttribute();
// 보인인증이 안된 경우 예외처리
if (niceAuth == null) {
throw new RuntimeException("회원가입시 본인인증은 필수입니다.");
}
// DB에 저장될 정보 set (본인인증 정보까지)
MemberSaveParameter member = new MemberSaveParameter();
member.setAuthId(niceAuth.getAuthId());
member.setName(niceAuth.getName());
member.setPhoneNumber(niceAuth.getPhoneNumber());
member.setMemberId(memberId);
// 회원 DB에 저장 로직 처리 후
// 보인인증 세션 초기화
httpSessionNiceAuth.removeAttribute();
return true;
}
@PostMapping("/login")
@ResponseBody
public boolean login(@RequestParam String memberId) {
// DB 조회해서 실제 회원인 경우라고 가정하고 예시
SessionMember member = new SessionMember();
member.setMemberId(memberId);
// 로그인 시 세션에 정보 저장
httpSessionMember.setAttribute(member);
return true;
}
@GetMapping("/mypage/info")
public String info(Model model) {
// 세션에 저장된 정보
model.addAttribute("member", httpSessionMember.getAttribute());
return "/mypage/info";
}
@GetMapping("/logout")
public String logout() {
// 로그아웃 시 모든 세션 정보 삭제
httpSessionMember.invalidate();
return "redirect:/main";
}
}
'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
자바 스프링부트 활용 웹개발 실무용 - 목차 (0) | 2023.07.03 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] 컨트롤러에서 파라미터를 받는 방법들 (0) | 2022.09.02 |
[자바 스프링부트 활용 웹개발 실무용] 파일 업로드와 썸네일 생성 (0) | 2022.08.27 |
[자바 스프링부트 활용 웹개발 실무용] TypeHandler로 데이터 변환하기 (0) | 2022.08.20 |
[자바 스프링부트 활용 웹개발 실무용] cron으로 로컬, 개발, 운영 설정값 프로퍼티에 따른 스케줄러 사용 (0) | 2022.08.18 |