문제 발생 :

로그인 페이지 생성과 로그인 로직 구현하고서 테스트 해보려고 하는데 맞는 비밀번호 임에도 로그인 오류가 발생 → 로그를 찍어보니 DB에서 데이터를 가져오지 못하는 걸 발견 → 로그를 찍으면서 로직 확인, 프로젝트 설정 확인, DB 연결 확인을 순차적으로 하던 도중 Mybatis가 문제인 것을 발견 → Mybatis 설정을 다시하고 확인해도 오류 발생 → 로그를 뜯어보다 DepartmentPosition에서 문제가 발생하는 것을 확인

문제 해결 과정 :

ENUM 매핑 문제 해결

  1. 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;
        }
    }
    
    
  2. TypeHandler 작성:

    @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);
        }
    }
    
    
  3. SQL 매퍼 파일 수정:

    <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 매핑 문제 및 네임스페이스 문제를 해결하여 데이터베이스 연결 및 쿼리 수행이 정상적으로 이루어졌음을 확인하였다.