resultCode
와 msg
를 반환하기 위한 RsData
클래스 생성
@Getter
@AllArgsConstructor
public class RsData {
private final String resultCode;
private final String msg;
}
tryLogin
메서드username
과 password
에 대한 검사를 진행한다.RSData
객체를 반환
@Service
public class MemberService {
public RsData tryLogin(String username, String password) {
if (username.equals("user1") && password.equals("1234")) {
return new RsData("S-1", username + "님 환영합니다.");
}
if (username.equals("user1")) {
return new RsData("F-1", "비밀번호가 일치하지 않습니다.");
}
return new RsData("F-2", username + "(은)는 존재하지 않는 회원입니다.");
}
}
memberService
에서 반환받은 RsData
객체를 리턴@ResponseBody
에 의해 반환 받은 객체를 웹페이지에 Json
형태로 출력username
과 password
에 대한 검사를 membeService
에서 진행해 코드가 간결해짐.
@Controller
public class MemberController {
private final MemberService memberService;
public MemberController() {
memberService = new MemberService();
}
@GetMapping("/member/login")
@ResponseBody
public RsData showLogin(@RequestParam String username, @RequestParam String password) {
return memberService.tryLogin(username, password);
}
}
/member/login?username=[유저네임]&password=[패스워드]
호출MemberController
의 showLogin
메서드 호출showLogin
메서드에서 username
과 password
를 토대로 memberService.tryLogin
메서드 반환tryLogin
메서드는 username
과 password
의 유효성 검사를 진행해 RsData
객체를 반환한다.RsData
객체는 @ResponseBody
에 의해 json
형식으로 출력된다.
@Data
@AllArgsConstructor
public class Member {
private final long id;
private final String username;
private final String password;
}
@Data
는 다음과 같은 어노테이션을 내포하고 있다.memberList
를 관리할 MemberRepository
생성findByUsername
메서드를 통해 memberList
에서 username
으로 member
찾기null
반환
@Repository
public class MemberRepository {
private static List<Member> memberList = new ArrayList<>();
private static long lastId = 0;
public MemberRepository() {
memberList.add(new Member(lastId++,"user1", "1234"));
memberList.add(new Member(lastId++,"abc", "12345"));
memberList.add(new Member(lastId++,"test", "12346"));
memberList.add(new Member(lastId++,"love", "12347"));
memberList.add(new Member(lastId++,"like", "12348"));
memberList.add(new Member(lastId++,"giving", "12349"));
memberList.add(new Member(lastId++,"thanks", "123410"));
memberList.add(new Member(lastId++,"hello", "123411"));
memberList.add(new Member(lastId++,"good", "123412"));
memberList.add(new Member(lastId++,"peace", "123413"));
}
public Member findByUsername(String username) {
for (Member member : memberList) {
if (member.getUsername().equals(username)) {
return member;
}
}
return null;
}
}
memberRepository
의 findByUsername
을 통해 반환받은 member
를 검사한다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
public MemberService() {
memberRepository = new MemberRepository();
}
public RsData tryLogin(String username, String password) {
Member member = memberRepository.findByUsername(username);
if (member == null) {
return new RsData("F-2", username + "(은)는 존재하지 않는 회원입니다.");
}
if (!member.getPassword().equals(password)) {
return new RsData("F-1", "비밀번호가 일치하지 않습니다.");
}
return new RsData("S-1", username + "님 환영합니다.");
}
}
username
과 password
에 대한 검사 추가
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController() {
memberService = new MemberService();
}
@GetMapping("/member/login")
@ResponseBody
public RsData showLogin(@RequestParam String username, @RequestParam String password) {
if ( username == null || username.trim().length() == 0 ) {
return new RsData("F-3", "username(을)를 입력해주세요.");
}
if ( password == null || password.trim().length() == 0 ) {
return new RsData("F-4", "password(을)를 입력해주세요.");
}
return memberService.tryLogin(username, password);
}
}
/member/login?username=[유저네임]&password=[패스워드]
호출username
과 password
에 대한 유효성 검사showLogin
메서드에서 username
과 password
를 토대로 memberService.tryLogin
메서드 반환tryLogin
메서드에서는 username
을 토대로 memberRepository.findByUsername
메서드 실행findByUsername
메서드는 memberList
에서 해당 username
을 가진 member
객체를 찾는다.member
객체를 반환하고, 없다면 null
반환memberService
의 tryLogin
에서 유효성 검사 및 RsData
객체 반환RsData
객체를 반환해 json
형식으로 출력한다.
// MemberController
private final MemberService memberService;
public MemberController() {
memberService = new MemberService();
}
// MemberService
private final MemberRepository memberRepository;
public MemberService() {
memberRepository = new MemberRepository();
}
@Component
어노테이션을 붙이면 스프링 컨테이너는 해당 클래스를 통해 빈 객체를 만들어 관리@Controller
, @Service
, @Repository
모두 @Component
를 내포하고 있다.@Autowired
를 통해 생성자 주입을 하면 스프링 컨테이너는 해당 타입의 빈 객체를 찾아 주입해준다. // MemberController
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
// MemberService
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
Rq
클래스 따로 생성setCookie
메서드는 로그인 성공시 쿠키를 만들어 브라우저에 응답하는 메서드이다.key
는 loginMemberId
, value
는 member
객체의 id
값이다.getLoginMemberId
메서드는 현재 브라우저에서 요청한 쿠키의 value
값(id)을 추출하는 메서드이다.null
반환removeCookie
메서드는 로그아웃 시 쿠키 정보를 삭제하는 메서드이다.
@Data
@AllArgsConstructor
public class Rq {
private HttpServletRequest request;
private HttpServletResponse response;
public Rq(HttpServletRequest request) {
this.request = request;
}
public Rq(HttpServletResponse response) {
this.response = response;
}
public void setCookie(Long id) {
response.addCookie(new Cookie("loginMemberId", id + ""));
}
public String getLoginMemberId() {
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
if (cookie.getName().equals("loginMemberId")) {
return cookie.getValue();
}
}
}
return null;
}
public void removeCookie(String key) {
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
if (cookie.getName().equals(key)) {
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}
}
}
/member/me
url 접속 시도
RsData
를 json
형식으로 출력 @GetMapping("/member/me")
@ResponseBody
public RsData showMe(HttpServletRequest request) {
Rq rq = new Rq(request);
String loginMemberId = rq.getLoginMemberId();
if (loginMemberId == null) {
return RsData.of("F-1", "로그인 후 이용해주세요.");
}
Member member = memberService.findById(Integer.parseInt(loginMemberId));
return RsData.of("S-1", "당신의 username(은)는 " + member.getUsername() + "입니다.");
}
/member/login?username=[유저네임]&password=[패스워드]
접속
memberList
에 저장된 username
과 password
로 로그인 시도rq.setCookie()
를 통해 쿠키를 발행해준다.RsData
를 json
형식으로 출력 @GetMapping("/member/login")
@ResponseBody
public RsData showLogin(HttpServletResponse response, @RequestParam String username, @RequestParam String password) {
if (username == null || username.trim().length() == 0) {
return RsData.of("F-3", "username(을)를 입력해주세요.");
}
if (password == null || password.trim().length() == 0) {
return RsData.of("F-4", "password(을)를 입력해주세요.");
}
Rq rq = new Rq(response);
RsData rsData = memberService.tryLogin(username, password);
if (rsData.isSuccess()) {
Member member = (Member) rsData.getData();
rq.setCookie(member.getId());
}
return rsData;
}
/member/me
재접속
이전 단계에서 로그인에 성공했다면 현재 나의 브라우저에 로그인 정보가 담긴 쿠키가 있을 것이다
또한, 현재 나의 접속 상태가 RsData
를 통해 Json
으로 정상 출력된다.
/member/logout
rq.removeCookie()
메서드를 통해 현재 내가 가진 쿠키를 제거함으로써 로그인 정보를 제거한다.```java
@GetMapping("/member/logout")
@ResponseBody
public RsData showLogout(HttpServletRequest request, HttpServletResponse response) {
Rq rq = new Rq(request, response);
rq.removeCookie("loginMemberId");
return RsData.of("S-1", "로그아웃 되었습니다.");
}
```