쿠키를 만들고 가져오는 예제
@GetMapping("/home/cookie/increase")
@ResponseBody
public int showCookieIncrease(HttpServletRequest req, HttpServletResponse resp) throws IOException { // 리턴되는 int 값은 String 화 되어서 고객(브라우저)에게 전달된다.
int countInCookie = 0;
// 고객이 가져온 쿠폰에서 count 쿠폰을 찾고 그 쿠폰의 값을 가져온다.
if (req.getCookies() != null) {
countInCookie = Arrays.stream(req.getCookies())
.filter(cookie -> cookie.getName().equals("count"))
.map(Cookie::getValue)
.mapToInt(Integer::parseInt)
.findFirst()
.orElse(0);
}
int newCountInCookie = countInCookie + 1;
// 고객이 가져온 count 쿠폰값에 1을 더한 쿠폰을 만들어서 고객에게 보낸다.
// 쉽게 말하면 브라우저(고객)에 저장되어 있는 count 쿠폰의 값을 1 증가시킨다.
// 이렇게 브라우저의 쿠키값을 변경하면 재방문시에 스프링부트가 다시 그 값을 받게 되어 있다.
resp.addCookie(new Cookie("count", newCountInCookie + ""));
// 응답 본문
return newCountInCookie;
}
이 부분이 쿠키를 만들고 추가하는 부분
"count"라는 이름의 쿠키를 만들고 newCountInCookie를 값으로 넣는다.
resp.addCookie(new Cookie("count", newCountInCookie + ""));
쿠키를 가져올 때는 getCookies()
이것저것 실험해 본 결과 꼭 하나의 클래스 또는 메서드에서 만들 필요 없음.
다른 곳에서 만들고 다른 곳에서 가져와 쓸 수 있음.
여러 클래스에서 동시에 어떤 클래스를 사용해야 할 때, 매번 만드는 것은 낭비임.
이 때 사용하는 것이 @Autowired
사용할 클래스 위에 @Service 또는 @Repository 이런 식으로 써주고
사용할 때 @Autowired를 쓰고 사용하면 된다.
예시 1. HomeController와 MemberController에서 MemberService를 사용하는 상황
@Service
public class MemberService {
// ...
}
//필드 주입 방식
public class HomeController {
private int count;
private final List<Person> people;
@Autowired
private MemberService memberService;
public HomeController() {
count = -1;
people = new ArrayList<>();
}
}
//생성자 주입 방식 (이걸 주로 사용함)
public class MemberController {
private int count;
private final List<Person> people;
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
count = -1;
people = new ArrayList<>();
this.memberService = memberService;
}
}