본문 바로가기

SpringBoot

[JAVA] enum 이란 무엇일까?

'스프링 시큐리티 OAuth2' 에 대해 공부중에 나온 개념이다.

스프링 부트 1.5 방식에서 2.0 방식으로 넘어오며 CommonOAuth2Privder라는 enum이 추가되었다고 한다.

따라서 구글, 깃허브, 페이스북, 옥타의 OAuth2를 이용할 때는 access token이나 authorization을 위한 url을 직접 입력해줄 필요가 없다고 한다.

 

여기서 enum이란 무엇일까?

정의부터 보자면 enum은 관련있는 상수의 집합이라고 할 수 있다.

enum은 흔히 열거형이라고 부른다.

 

이해를 위해 바로 예시를 들어보자.

만약 요일과 관련된 상수 집합을 클래스로 만들려고 하면 다음과 같이 만들 수 있다.

class Day{
    public final static Day MONDAY = new Day();
    public final static Day TUESDAY = new Day();
    public final static Day WEDNESDAY = new Day();
    public final static Day THURSDAY = new Day();
    public final static Day FRIDAY = new Day();
    public final static Day SATURDAY = new Day();
    public final static Day SUNDAY = new Day();
}

이렇게 했을 경우 어떤 문제점이 있을까?

각 요일은 Day라는 타입을 갖는다.

만약 switch를 사용해 요일을 구분하는 코드를 작성한다면 에러가 발생할 것이다.

switch에 들어갈 수 있는 데이터 타입에는 제한이 있기 때문이다.

그리고 겉으로 보기에도 뭔가 좀 불편하다.

 

그런데 enum을 사용한다면 이렇게 달라진다.

enum Day{
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

코드가 정말 짧아졌다.

이렇게 하면 우리는 Day.MONDAY, Day.TUESDAY 이런 식으로 각 요일을 상수로 취급해서 접근할 수가 있다.

 

enum 안의 상수에 속성을 부여할 수도 있다.

public enum Day{

    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일");

    private String dayName;

    private Day(String dayName){
        this.dayName = dayName;
    }

    public String getDayName(){
        return dayName;
    }
}

이렇게 하면 Day day = Day.MONDAY 를 하나 생성했을 때 day.getDayName() 을 이용해 "월요일" 이라는 값을 가져올 수 있게 된다.

 

그래서 다시 처음으로 돌아와서 CommonOAuth2Provider라는 enum이 추가 되었다는게 무슨 뜻인가 보면

스프링 부트 2.0 버전에 이런게 추가 되었다는 뜻이다.

public enum CommonOAuth2Provider{

    GOOGLE {

        @Override
        public Builder getBuilder(String registrationId) {
            ClientRegistration.Builder builder = getBuilder(registrationId, ClientAuthenticationMethod.BASIC, DEFAULT_REDIRECT_URL);
            builder.scope("openid", "profile", "email");
            builder.authorizationUri("https://accounts.google.com/o/oauth2/v2/auth");
            builder.tokenUri("https://www.googleapis,com/oauth2/v4/token");
            builder.jwkSetUri("https://www.googleapis.com/oauth2/v3/certs");
            builder.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo");
            builder.userNameAttributeName(IdTokenClaimNames.SUB);
            builder.clientName("Google");
            return builder;
        }
    },

    ...
}

이렇게 타 사이트의 OAuth2를 사용하기 위해 필요한 Uri 정보들이 미리 저장되어 있기 때문에 따로 코드를 작성하지 않아도 쉽게 사용할 수 있다는 뜻이다.

다만 네이버, 카카오는 아직 추가되지 않았다.

따라서 네이버, 카카오의 OAuth2를 사용하려면 저 내용들을 다 직접 추가해줘야 한다.

 

[참고]

- 스프링부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 지음)

- https://www.nextree.co.kr/p11686/