16주차 - Spring (6) 세션(Session)을 사용해보자.

2022. 10. 18. 19:58Spring framwork

이번의 목표

01. 세션(Session)을 사용해보자.

02. 세션을 확인해보자.


지난 시간에는 쿠키(Cookie)에 대해 공부했습니다. 이번에는 그와 비슷한 기능을 하지만 사뭇 다른 세션(Session)에 대해 공부해보겠습니다.

 예전에 jsp를 공부할때 기본 객체인 session의 기능에 대해 공부했었습니다.

이때 세선에 속성값을 저장하는 방법은 아래와 같았습니다.

session.setAttribute("name","value")

스프링에서도 setAttribute를 사용하는것은 동일하지만 session을 사용하기 위해서는 HttpSession이 필요합니다.

그리고 이번 예제에서는 오라클 데이터베이스와 연동하여 로그인을 해보겠습니다.

스프링에서도 데이터베이스와 연결하는 기본적인 방법은 JSP때와 동일합니다.

서버와의 커넥션, 디스커넥션을 스프링에서 관리해줄수 있도록 하는 내용은 추후 다루겠습니다.

 

01. 인덱스 페이지 코드
02. 로그인 페이지 코드
03. 컨트롤러 코드
04. 서비스 코드
05. DAO 코드
06. DTO 코드

 

01. 인덱스 페이지 코드

<h2>인덱스 페이지</h2>
<c:choose>
	<c:when test="${empty sessionScope.id }">
		<a href='login'>로그인</a>
	</c:when>
	<c:otherwise>
		<a href='logout'>로그아웃</a>
	</c:otherwise>
</c:choose>

<h3>세션 확인</h3>
아이디 : ${sessionScope.id }<br>
비밀번호  : ${sessionScope.pw }

02. 로그인 페이지 코드

<h2>로그인 페이지</h2>
<c:choose>
	<c:when test="${empty sessionScope.id or empty sessionScope.pw}">
<form action="make" method="post">
<input type="text" name="id" placeholder="아이디"><br>
<input type="text" name="pw" placeholder="비밀번호"><br>
<input type="submit" value="로그인">
<input type="button" value="취소" onclick="location.href='index'">
</form>
	</c:when>
	<c:otherwise>
	<h3>이미 로그인 되어있습니다.</h3>
	<input type="button" value="돌아가기" onclick="location.href='index'">
	</c:otherwise>
</c:choose>

03. 컨트롤러 코드

@Controller
public class SessionDbController {
	@Autowired
	HttpSession session;
	
	@Autowired
	private SessionDbService service;
	
	@RequestMapping("session/index")
	public void index() {}

	@RequestMapping("session/login")
	public void login() {
	}

	@RequestMapping("session/make")
	public String make(SessionDbDTO dto, RedirectAttributes ra) {
		String result = service.login(dto);
		if(result.equals("로그인 성공")) {
			ra.addFlashAttribute("msg", result);
			return "redirect:index";
		}
		return "session/login";
	}

	@RequestMapping("session/logout")
	public String logout() {
		session.invalidate();
		return "redirect:index";
	}
}

04. 서비스 코드

@Service
public class SessionDbService {

	@Autowired
	private HttpSession session;
	@Autowired
	private SessionDbDAO dao;
	
	public String login(SessionDbDTO dto) {
		if(dto.getId().isEmpty()||dto.getPw().isEmpty()) {
			return "필수 정보입니다.";
		}
		SessionDbDTO result = dao.login(dto.getId());
		
		if(result==null || (dto.getPw().equals(result.getPw())==false) ) {
			return "아이디 / 비밀번호를 확인해주세요";
		}
		
		session.setAttribute("id", dto.getId());
		session.setAttribute("pw", dto.getPw());
		return "로그인 성공";
	}
}

05. DAO 코드

@Repository
public class SessionDbDAO {
	@Autowired
	private HttpSession session;
	
	private PreparedStatement ps;
	private Connection con;
	private ResultSet rs;
	
	public SessionDbDAO() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user ="oracle";
		String password = "oracle";
		
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			con = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public SessionDbDTO login(String id) {
		String sql = "SELECT * FROM session_test WHERE id=?";
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, id);
			rs = ps.executeQuery();
			if(rs.next()) {
				SessionDbDTO dto = new SessionDbDTO();
				dto.setId(rs.getString("id"));
				dto.setPw(rs.getString("pw"));
				dto.setEmail(rs.getString("email"));
				dto.setName(rs.getString("name"));
				return dto;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

06. DTO 코드

public class SessionDbDTO {

	private String id;
	private String pw;
	private String name;
	private String email;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}
}