세션(3) : 연관된 정보 저장을 위한 클래스 작성

de_sj_awa·2021년 5월 21일
0

연관된 정보 저장을 위한 클래스 작성

앞서 예제 코드에서 사용자 정보를 다음과 같이 저장했다.

<%
    session.setAttribute("MEMBERID", memberId);
%>

회원 ID뿐만 아니라 회원 이름과 같은 추가 정보를 세션에 추가해야 한다면, 다음과 같이 세션 속성을 하나 더 추가하는 방법으로 구현해 볼 수 있을 것 같다.

<%
    session.setAttribute("MEMBERID", memberId);
    session.setAttribute("NAME", name);
%>

session 기본 객체에서 속성을 가져와 사용하는 부분도 새로운 코드가 추가될 것이다.

<%
    String memberId = (String)session.getAttribute("memberId");
    String name = (String)session.getAttribute("name");
%>
...
<%= name %>

만약 세션에 저장할 값의 개수가 많다면 어떻게 될까? 이 경우, 세션에서 값을 읽어오는 코드는 다음과 같이 변경될 것이다.

<%
    String memberId = (String)session.getAttribute("memberId");
    String name = (String)sessin.getAttribute("name");
    String email = (String)session.getAttribute("email");
    boolean mail = (Boolean)session.getAttribute("male");
    int age = (Integer)session.getAttribute("age");
%>
...
<%
    if(age < 18){
        ...
    }
%>

속성에 저장되는 값의 개수나 변수명의 개수가 증가할수록 코드를 분석하고 관리하는 데 더 많은 시간이 소요된다. 또한, 연관된 속성 중 일부를 실수로 잘못 처리할 수도 있다. 예를 들어, 이메일 주소 정보가 더는 필요하지 않아서 세션에 저장하지 않는데, 이메일 주소 정보를 세션에서 읽어오는 코드를 실수로 남겨둘 수도 있다. 이 경우 NullPointerException이 발생할 수고 개발자는 익셉션 발생 원인을 찾느라 불필요한 시간을 허비하게 된다.

<%-- 세션을 설정하는 부분 --%>
<%
    session.setAttribute("memberId", memberId);
    // session.setAttribute("email", email);  코드 제거
%>
<%-- 세션을 읽어오는 부분에서 삭제해야 할 코드를 놓침 --%>
<%
    String memberId = (String)session.getAttribute("memberId");
    String email = (String)session.getAttribute("email)"
%>
...
<%= email.toLowerCase() %> // NullPointerException 발생

세션에 여러 속성을 사용해서 연관 정보들을 저장할 때 발생할 수 있는 문제점을 줄일 수 있는 방법은 클래스를 사용하는 것이다. 예를 들어, 회원과 관련된 정보를 다음과 같은 클래스에 묶어서 저장한다고 해보자.

public class MemberInfo{
    private String id;
    private String name;
    private String email;
    private boolean male;
    private int age;
    
    // get 메서드
}

연관된 정보를 클래스로 묶어서 저장하면 각 정보를 개별 속성으로 저장하지 않고 다음과 같이 한 개의 속성을 이용해서 저장할 수 있다.

<%
    MemberInfo memberInfo = new MemberInfo(id, name);
    session.setAttribute("memberInfo", memberInfo);
%>

연관된 정보를 한 객체에 담아 저장하기 때문에, 세션에 저장한 객체를 사용할 때에도 다음과 같이 객체를 가져온 뒤 객체로부터 필요한 값을 읽어올 수 있다.

<%
    MemberInfo member = (MemberInfo)session.getAttribute("memberInfo");
%>
...
<%= memberInfo.getEmail().toLowerCase() %>

만약 이메일 주소를 저장할 필요가 없어서 getEmail() 메서드를 MemberInfo 클래스에서 삭제했다고 하자. 위 경우 위 코드를 실행하면 NullPointerException이 발생하기보다는 MemberInfo 클래스에는 getEmail() 메서드가 존재하지 않는다는 컴파일 에러가 발생한다. 익셉션을 추적하는 것보다 컴파일 에러를 처리하는 것이 상대적으로 쉽기 때문에 개발자가 문제를 해결하기 쉬워진다.

참고

  • 최범균의 JSP2.3 웹 프로그래밍
profile
이것저것 관심많은 개발자.

0개의 댓글