oracle = 자료보관용(중요) = 파일보관
mongodb = 자료보관용(분석) = 파일보관
redis = 세션용DB = 메모리보관
세션 : 중요하지않음, 속도가 빠를수록 좋음
때문에 세션용 DB를 사용
Session 사용환경설정
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
</dependency>
@EnableMongoHttpSession(collectionName = "sessions", maxInactiveIntervalInSeconds = 600)
@Bean
@Bean
public JacksonMongoSessionConverter mongoSessionConverter() {
return new JacksonMongoSessionConverter();
}
@SpringBootApplication
// 임의로 만든 컨트롤러의 위치를 지정
// 임의로 만든 서비스의 위치를 지정
@ComponentScan(basePackages = { "com.example.controller", "com.example.service" })
// sesseions라는 컬렉션에 10분간 저장
@EnableMongoHttpSession(collectionName = "sessions", maxInactiveIntervalInSeconds = 600)
public class Boot20220228Application {
public static void main(String[] args) {
SpringApplication.run(Boot20220228Application.class, args);
System.out.println("Hello World!");
}
// @Bean => 프로그램이 구동되기 전에 미리 만들어지는 객체
// JacksonMongoSessionConverter obj = new JacksonMongoSessionConverter();
@Bean
public JacksonMongoSessionConverter mongoSessionConverter() {
return new JacksonMongoSessionConverter();
}
}
HttpSession - 로그인/로그아웃
Query
= 조건
: _id와 pw가 일치
: query에 추가하는 타입은 Criteria
: Criteria.where("_id").is(member.getId())
: Criteria.where("pw").is(member.getPw())
findOne()
에 필요한 파라미터 조건
: findOne(query, entityClass T)
: entityClass는 Member
= 리턴값도 Member
// 로그인
@Override
public Member selectLogin(Member member) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(member.getId());
Criteria criteria1 = Criteria.where("pw").is(member.getPw());
query.addCriteria(criteria);
query.addCriteria(criteria1);
return mongodb.findOne(query, Member.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Autowired
private HttpSession httpSession;
@GetMapping
// 127.0.0.1:8080/member/login
// 로그인 GET
@GetMapping(value = "/login")
public String loginGET() {
return "/member/login";
}
_id
, pw
)을 DB와 비교해서 존재여부 확인Member retMember = memberDB.selectLogin(member);
if (retMember != null)
= 결과retMember가 null이 아니라면!httpSession.setAttribute("USERID", retMember.getId());
httpSession.setAttribute("USERNAME", retMember.getName());
// 로그인 POST
@PostMapping(value = "/login")
public String loginPOST(
@ModelAttribute Member member) {
// DB에 아이디, 암호를 전달하여 일치하는 항목이 있는지 확인
Member retMember = memberDB.selectLogin(member);
// System.out.println("retMember ===> " + retMember);
if (retMember != null) {
// 여기가 로그인이 되는 시점!!
// 세션 사용 => 서버(메모리)에 기록되는 정보(어떤 주소, 어떤 컨트롤러에서든 사용가능(공유가능) jsp에서도 가능!)
httpSession.setAttribute("USERID", retMember.getId());
httpSession.setAttribute("USERNAME", retMember.getName());
System.out.println("httpSession ===> " + httpSession);
return "redirect:/home";
}
return "redirect:/member/login";
}
httpSession.invalidate();
// 로그아웃
@GetMapping(value = "/logout")
public String logoutGET() {
// 세션을 삭제함
httpSession.invalidate();
return "redirect:/home";
}
@GetMapping(value = { "/", "home" })
public String homeGET(HttpSession httpSession) {
// HttpSession httpSession 빈 세션을 생성한다.
// home.jsp를 표시하라
return "home";
}