Spring #10 - Session/Login

김형우·2022년 3월 3일
0

Spring

목록 보기
11/19

oracle = 자료보관용(중요) = 파일보관
mongodb = 자료보관용(분석) = 파일보관
redis = 세션용DB = 메모리보관

세션 : 중요하지않음, 속도가 빠를수록 좋음

  1. 메모리에서 관리할 경우 (쿠키와 다름)
    3000명 감당 가능한 서버라는 가정
    서버1(1000), 서버2(1000), 서버3(1000)
    서버1에서 로그인 하고 메모리에만 저장되어있으면
    서버2로 넘어갔을때 로그인되어있지 않다고 나옴
    => 8080에서 로그인하면 3000번에서는 모름
    그래서 토큰을 만들어서 던진거였음!!!!

때문에 세션용 DB를 사용

Session 사용환경설정

1. pom.xml

  1. 라이브러리 추가
<dependency>
	<groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-mongodb</artifactId>
</dependency>

2. Boot20220228Application.java

  1. 실행파일에서 session 사용 정의
    : sesseions라는 컬렉션에 10분간 저장
    : @EnableMongoHttpSession(collectionName = "sessions", maxInactiveIntervalInSeconds = 600)
  2. MongoDB에 세션 저장 명령
    2-1. @Bean
    : 프로그램이 구동되기 전에 미리 만들어지는 객체
    2-2. MongoSession을 사용 할 객체 생성
    : 미리 만들어짐
@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 - 로그인/로그아웃

1. MemberDBImpl.java

  1. Query = 조건
    : _id와 pw가 일치
    : query에 추가하는 타입은 Criteria
    : Criteria.where("_id").is(member.getId())
    : Criteria.where("pw").is(member.getPw())

  2. 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;
    }
}

2. MemberController.java - 로그인

  1. 세션 사용할 객체 생성
@Autowired
private HttpSession httpSession;
  1. 로그인 뷰 불러오기
    : @GetMapping
// 127.0.0.1:8080/member/login
// 로그인 GET
@GetMapping(value = "/login")
public String loginGET() {
    return "/member/login";
}
  1. 로그인 수행 - 세션사용
    3-1. 전달받은 값(조건 : _id, pw)을 DB와 비교해서 존재여부 확인
    : Member retMember = memberDB.selectLogin(member);
    3-2. 존재한다면!
    : if (retMember != null) = 결과retMember가 null이 아니라면!
    : 이 if문이 돌아가는 시점이 로그인 되는 시점
    3-3. DB 세션에 id와 name을 저장한다.
    : httpSession.setAttribute("USERID", retMember.getId());
    : httpSession.setAttribute("USERNAME", retMember.getName());
    3-4. 세션을 사용하다는것은
    : 서버(메모리)에 기록되는 정보(어떤 주소, 어떤 컨트롤러에서든 사용가능(공유가능) jsp에서도 가능!)
    : 세션을 생성하면 MongoDB에 session컬렉션에도 생성이 되지만 Chrome브라우저의 쿠키에도 생성이 된다.
// 로그인 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";
}

3. MemberController.java - 로그아웃

  1. 로그인 할때 생성한 DB의 session의 정보를 완전히 삭제함.
    : httpSession.invalidate();
// 로그아웃
@GetMapping(value = "/logout")
public String logoutGET() {
    // 세션을 삭제함
    httpSession.invalidate();
    return "redirect:/home";
}

4. HomeController.java - 세션검사

  1. home에서 세션을 확인하고, 없으면 빈 세션을 생성한다.
    : 이렇게 생성된 빈 세션에는 "USERID"와 "USERNAME"이 들어있지 않다.
@GetMapping(value = { "/", "home" })
public String homeGET(HttpSession httpSession) {
	// HttpSession httpSession 빈 세션을 생성한다.
    // home.jsp를 표시하라
    return "home";
}
profile
The best

0개의 댓글