스프링은 컴포넌트들을 IoC컨테이너에 저장해 두고 필요할 때 꺼내쓴다.
사용할 때마다 new로 객체생성 안한다.
필드에 직접 컨테이너의 요소를 주입한다.
@Autowired
private MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
HttpServletRequest,HttpServletResponse 객체를 이용하여 요청과 응답에 대한 설정을 직접 구현하는 것은 Controller에서 이루어질 관심사가 아니다.
해당 작업만을 하는 클래스의 객체를 따로 생성하는 것이 효율적이다.
아래는 요청과 응답의 쿠키설정을 하는 Rq클래스의 코드이다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
private final MemberService memberService;
@GetMapping("/login")
public RsData login(HttpServletResponse res, String username, String password) {
Rq rq = new Rq(null, res);
if (username == null || password == null) {
return RsData.result("F-3", "Username 과 password를 입력해주세요.");
}
RsData rsData = memberService.tryLogin(username, password);
if (rsData.isSuccess()) {
rq.setCookie("user", rsData.getData().toString());
}
return rsData;
}
@GetMapping("/logout")
public RsData logout(HttpServletRequest req, HttpServletResponse res) {
Rq rq = new Rq(req, res);
rq.removeCookie("user");
return RsData.result("S-1", "로그아웃 되었습니다.");
}
@GetMapping("/me")
public RsData me(HttpServletRequest req) {
Rq rq = new Rq(req, null);
String username = rq.getCookie("user", "anonymous");
if (username.equals("anonymous")) {
return RsData.result("F-1", "로그인 후 이용해주세요");
}
return RsData.result("S-1", String.format("당신의 username은 %s입니다.", username));
}
}