공부/그룹 스터디

[5회차 04] Enum - 메시지 처리

junani0v0 2024. 5. 6. 22:21

메시지 처리

프론트에 메시지를 직접전달하면 너무 많은 데이터를 많이 사용하게됩니다.(한글 한글자 = 2바이트, 1바이트 = 8비트)
통신을 할때 가장 중요한것은 쓸데없는 데이터를 최소화 하는 것입니다
이걸 해결하기 위해 공통으로 사용하는 코드를 만들어 사용합니다 (ex. 0000:성공, 9999:알수 없는 에러)
이렇게 숫자 4개만 보내면 프론트에서 이 숫자 4개만 찾아서 보여주면 됩니다

Rest에서는 보통 이렇게 사용하지만 Legacy에서는 그게 잘 안되기에 흉내만 한번 내서 사용해 보겠습니다

enum : 태생이 싱글톤

MessageEnum.java생성

com.portfolio.www.message 패키지를 만들고 Enum으로 MessageEnum.java파일을 생성합니다

public enum MessageEnum {

    //생성자 무조건 필요, 앞에 부분을 생성자로 취급
    SUCCESS("0000","성공"),
    USER_NOT_FOUND("9000","사용자가 없습니다");

    MessageEnum(String code, String description){
        this.code = code;
        this.description = description;
    }

    private String code;
    private String description;

    //Enum은 setter 필요X, getter만 필요
    public String getCode() {
        return code;
    }
    public String getDescription() {
        return description;
    }
}

Enum은 생성자가 무조건 필요하며, 앞에 부분(ex. SUCCESS)를 생성자로 취급합니다

이렇게 code, description을 선언해주고 getter를 만들어줍니다
enum은 setter는 필요하지 않습니다 (가져다 사용만 하기위해)

이제 사용할 코드들을 위처럼 정의해놓고 사용하면 됩니다(,로 계속 열거 후 마지막에만 ;해서 닫아줍니다)

LoginController

기존코드

@RequestMapping("login.do")
public ModelAndView login(
        HttpServletRequest request,
        @RequestParam HashMap<String, String> params) {
    ModelAndView mv = new ModelAndView();
    MemberDto memberDto = null;

    try {
        memberDto = joinService.login(params);    //사용자 확인
        if(!ObjectUtils.isEmpty(memberDto)) {    //로그인을 했으면 null값이 아닐테니
            //세션 처리
            //세션을 불러와서
            HttpSession session = request.getSession();
            //memberId넣어줌
            session.setAttribute("memberId", memberDto.getMemberId());
            mv.setViewName("main");
        }else {    //비밀번호가 다른경우
            mv.setViewName("login");
            mv.addObject("code", "9001");
            mv.addObject("msg", "비밀번호가 틀렸습니다");
        }
    } catch (EmptyResultDataAccessException e) { //사용자가 없는경우
        mv.setViewName("login");
        mv.addObject("code", "9000");
        mv.addObject("msg", "사용자가 없습니다");
    }
    return mv;
}

사용자 없음(USER_NOT_FOUND)를 정의해놨으니 이걸 사용해보겠습니다

} catch (EmptyResultDataAccessException e) { //사용자가 없는경우
    mv.setViewName("login");
    mv.addObject("code", MessageEnum.USER_NOT_FOUND.getCode());
    mv.addObject("msg", MessageEnum.USER_NOT_FOUND.getDescription());
}

이렇게 만든 enum명.코드명.get가져올 값으로 작성하여 값을 불러옵니다


서버를 재시작 후 잘 작동하는 것을 확인한 후 이제 다른 에러코드와 메시지를 등록해 주겠습니다.

MessageEnum 에러코드 & 메시지 등록

public enum MessageEnum {

    //생성자 무조건 필요, 앞에 부분을 생성자로 취급
    SUCCESS("0000","성공"),
    USER_NOT_FOUND("9000","사용자가 없습니다"),
    PASSWORD_ERROR("9001","비밀번호가 틀렸습니다");

비밀번호가 틀렸을 경우의 에러코드도 등록하였습니다

Tip.

`Enum`은 따로 컴포넌트로 찾아보거나 Bean등록을 할 필요가 없습니다 (자체적으로 싱글톤이기때문에 런타임되면 JVM에 자동으로 같이 올라갑니다) 그렇기에 따로 선언하지 않고 객체를 생성하지 않아도 사용할 수 있습니다

login.jsp

<script type="text/javascript">
    window.onload = function(){
        var code = '${code}';
        var msg = '${msg}';
        if(code != '' && code != '0000'){
            alert(msg);
            window.location.href = '/05/loginPage.do';
            //성공하든 실패하든 무조건 리다이랙트되야됨
        }
    }
</script>

이제 login.jsp에서 '0000'이라고 하드코딩된 에러코드를 수정해보겠습니다

백에서 만든 enum코드를 어떻게 가져올까요??
먼저 jsp제일 상단에 page import를 시켜줘야합니다

<%@ page import = "com.portfolio.www.message.MessageEnum" %>

이렇게 우리가 만든 enum 패키지 경로를 입력하여 jsp파일 최상단에 page import시켜줍니다

이렇게 import시켜줌으로서 이제 enum코드를 가져올 수 있습니다

<script type="text/javascript">
window.onload = function(){
    var code = '${code}';
    var msg = '${msg}';
    if(code != '' && code != <%= MessageEnum.SUCCESS.getCode() %>){
        alert(<%= MessageEnum.SUCCESS.getDescription() %>);
        window.location.href = '/05/loginPage.do';
        //성공하든 실패하든 무조건 리다이랙트되야됨
    }
}
</script>

이렇게 성공코드를 가져와 사용함으로서 코드가 변경되어서 쉽게 사용이 가능해집니다

서버를 실행하고 로그인페이지를 가보면

페이지 소스를 열어보면 자동으로

<%= MessageEnum.SUCCESS.getCode() %>

위 코드가 '0000'으로 자동으로 바뀌어있는걸 확인할 수 있습니다

그 이유는 jsp는 자바 서버 페이지로 서버에서 컴파일 되서 java코드를 처리하고 html로 사용자에서 보여줍니다
즉, 컴파일 되는 시점이 다릅니다 그렇기에 사용자는 java코드를 볼 수 없습니다