Enum 응용

Updated:

Java

Enum 응용

서론

토비의 스프링 3.1을 공부하다, Enum 내용이 나와 정리하였다.

DB에 등급을 나타내는 정보를 넣어야 한다고 가정하자.
“BASIC”, “SILVER”, “GOLD”의 3개 등급을 문자로 넣는 방법도 잇겠지만, 일정한 종류의 정보를 문자열로 넣는 것은 별로 좋아보이지 않는다.
대신 각 레벨을 코드화 하여 숫자로 넣는 것은 나쁘지 않은 방법이다.
하지만, 코드 상으로 프로퍼티 타입을 정수형은 타입이 안전하지 않아 위험하다.

선언

따라서, 숫자 타입을 직접 사용하는 것 보다는 이늄(Enum)을 사용한다.

public enum Level {
	BASIC(1), SILVER(2), GOLD(3);	// 3개의 이넘 오브젝트

	private final int value;

	Level(int value){	// DB에 저장할 값을 생성자로 만든다.
		this.value = value;
	}
	// int형 값을 가져오는 메서드
	public int intValue() {
		return value;
	}
	// int 값을 LEVEL 타입 오브젝트로 가져온다.
	public static Level valueOf(int value) {
		switch(value) {
			case 1 : return BASIC;
			case 2 : return SILVER;
			case 3 : return GOLD;
			default : throw new AssertionError("Unknown value : " + value);
		}
	}
}

사용 방법

사용

Level.BASIC
Level.SILVER
Level.GOLD

DB에 입력

DB에는 정수 형으로 저장하기 때문에, intValue()로 변환하여 저장한다.

public void add(final User user) throws DuplicateUserIdException {
		try {
			jdbcTemplate.update("insert into users(id, name, password, level, login, recommend) values(?,?,?,?,?,?)",
					user.getId(), user.getName(), user.getPassword(), user.getLevel().intValue(), user.getLogin(), user.getRecommend());
		} catch (DuplicateKeyException  e) {
			throw new DuplicateUserIdException(e);
		}
	}

DB에서 가져오기

DB에는 int형으로 저장 되어 있으므로, Level 오브젝트로 변환하여 가져온다.

private RowMapper<User> userMapper = new RowMapper<User>() {
		@Override
		public User mapRow(ResultSet rs, int rowNum) throws SQLException {
			User user = new User();
			user.setId(rs.getString("id"));
			user.setName(rs.getString("name"));
			user.setPassword(rs.getString("password"));
			user.setLevel(Level.valueOf(rs.getInt("Level")));	// DB에는 int형으로 저장 되어 있으므로, LEVEL 오브젝트로 적절히 변환
			user.setLogin(rs.getInt("Login"));
			user.setRecommend(rs.getInt("Recommend"));
			return user;
		}
	};

참고

토비의 스프링 3.1 - chpater 5