로그인 페이지 생성과 로그인 로직 구현하고서 테스트 해보려고 하는데 맞는 비밀번호 임에도 로그인 오류가 발생
→ 로그를 찍어보니 DB에서 데이터를 가져오지 못하는 걸 발견
→ 로그를 찍으면서 로직 확인, 프로젝트 설정 확인, DB 연결 확인을 순차적으로 하던 도중 Mybatis가 문제인 것을 발견
→ Mybatis 설정을 다시하고 확인해도 오류 발생
→ 로그를 뜯어보다 Department
와 Position
에서 문제가 발생하는 것을 확인
ENUM 매핑 문제:
인터넷 글을 서치하다 Department
와 Position
ENUM을 MyBatis와 함께 사용하기 위해서는 TypeHandler
라는 것이 필요한 것임을 알게됨.
EnumTypeHandler
와 EnumOridinalTypeHandler
가 필요하다고 하여 적용해도 계속 오류가 발생
지원하지 않는 데이터 타입의 경우 Custom을 해야한다고 하여 Department과 Postion
를 전면 수정 후 DepartmentTypeHandler
와PostionTypeHandler
을 구현했다
DepartmentTypeHandler
에서 ENUM 매핑 중 "Unknown displayName: HR"와 같은 오류가 발생, 이는 데이터베이스에서 가져온 값이 ENUM 값과 일치하지 않았기 때문이였다.
ENUM 클래스 수정:
Department
와 Position
ENUM 클래스를 전면 수정public enum Department {
PR("생산"),
QC("품질관리"),
SA("영업"),
MK("마케팅"),
FI("재무"),
HR("인사"),
RD("연구개발");
private final String displayName;
Department(String displayName) {
this.displayName = displayName;
}
String getDisplayName() {
return displayName;
}
}
public enum Position {
사원(1),
대리(2),
과장(3),
차장(4),
부장(5),
사장(6);
private final int rank;
Position(int rank) {
this.rank = rank;
}
int getRank() {
return rank;
}
}
TypeHandler 작성:
DepartmentTypeHandler
와 PositionTypeHandler
를 작성해 ENUM 값을 데이터베이스와 매핑@MappedTypes(Department.class)
public class DepartmentTypeHandler implements TypeHandler<Department> {
@Override
public void setParameter(PreparedStatement ps, int i, Department parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.name());
}
@Override
public Department getResult(ResultSet rs, String columnName) throws SQLException {
String name = rs.getString(columnName);
return Department.valueOf(name);
}
@Override
public Department getResult(ResultSet rs, int columnIndex) throws SQLException {
String name = rs.getString(columnIndex);
return Department.valueOf(name);
}
@Override
public Department getResult(CallableStatement cs, int columnIndex) throws SQLException {
String name = cs.getString(columnIndex);
return Department.valueOf(name);
}
}
SQL 매퍼 파일 수정:
CustomTypeHandler
설정으로 변경<result property="department" column="department_id" javaType="com.woosan.hr_system.employee.model.Department" typeHandler="com.woosan.hr_system.employee.model.DepartmentTypeHandler"/>
<result property="position" column="position_id" javaType="com.woosan.hr_system.employee.model.Position" typeHandler="com.woosan.hr_system.employee.model.PositionTypeHandler"/>
위의 문제를 해결한 후, 데이터베이스 연결 테스트를 성공적으로 수행하였다. 테스트 코드에서는 특정 직원 ID로 데이터를 조회하여 콘솔에 출력해보았다.
@SpringBootTest
public class DatabaseConnectionTest {
@Autowired
private EmployeeService employeeService;
@Test
void testDatabaseConnection() {
Employee employee = employeeService.getEmployeeById("HR1111111");
if (employee != null) {
System.out.println("Employee found: " + employee.getName());
} else {
System.out.println("Employee not found.");
}
}
}
테스트 실행 결과:
Employee found: 홍길동
성공! MyBatis와 ENUM 매핑 문제 및 네임스페이스 문제를 해결하여 데이터베이스 연결 및 쿼리 수행이 정상적으로 이루어졌음을 확인하였다.