Conversation
- UserRepository 클래스 추가
- 회원가입 핸들러에 길이 및 중복 유효성 검사 로직 추가
| return params.getQueryValue(key) | ||
| .orElseThrow(() -> new ServiceException(ErrorCode.MISSING_REGISTER_TOKEN, key + " required")); | ||
| } |
There was a problem hiding this comment.
중복검사 성능 문제: findByColumn()을 각각 호출할 때마다 데이터베이스 쿼리가 2번 발생합니다. 비용이 큰 작업이므로 검사 순서를 조정하거나 길이 검증을 먼저 수행한 후 중복 검사를 하는 것이 좋습니다(유효하지 않은 데이터로 불필요한 DB 쿼리 방지).
또한 findByColumn(EMAIL, email) 호출 시 문자열 리터럴 "email"을 사용하는데, 이는 EMAIL 상수와 불일치할 위험이 있습니다. 상수 값이 실제 DB 컬럼명과 정확히 일치하는지 확인이 필요합니다.
| continue; | ||
| } | ||
| if ("id".equals(field.getName())) { | ||
| if ("id".equals(toColumnName(field.getName()))) { |
There was a problem hiding this comment.
논리 오류: 필드명 "id"를 snake_case로 변환한 결과와 비교하고 있지만, "id"는 변환해도 "id"이므로 실제로는 정상 동작합니다. 다만 명확성을 위해 변환 전 원본 필드명으로 비교하는 것이 낫습니다: if ("id".equals(field.getName())) 사용 권장.
| public List<T> findByColumn(String columnName, Object value) { | ||
| String sql = "SELECT * FROM " + tableName + " WHERE " + columnName + " = ?"; | ||
| String sql = "SELECT * FROM " + tableName + " WHERE " + toColumnName(columnName) + " = ?"; |
There was a problem hiding this comment.
SQL 인젝션 위험: 사용자 입력인 columnName 파라미터를 toColumnName()을 거쳐서 SQL에 직접 삽입하고 있습니다. toColumnName() 검증만으로는 충분하지 않습니다. 특수 문자 필터링이나 허용 목록 검증(whitelist)을 추가하거나, 더 안전한 메커니즘을 사용하세요.
| logger.debug("{} - {}", error.getMessage(), error.getThrowable().toString()); | ||
| ErrorCode errorCode = error.getErrorCode(); | ||
| HttpStatus status = errorCode.getStatus(); | ||
|
|
There was a problem hiding this comment.
응답 일관성 문제: ErrorCode.getMessage()로 변경했으나, 이전에 error.getMessage()에서 반환되던 값은 무엇인지 확인 필요합니다. 호출자가 원래 전달한 메시지를 의도했다면 정책 변경이 문제가 될 수 있습니다. 항상 ErrorCode 메시지만 반환할 것인지 명확히 정의하세요.
|
|
||
| public static final int EMAIL_MAX = 50; | ||
| public static final int EMAIL_MIN = 4; | ||
| public static final int NICKNAME_MAX = 12; | ||
| public static final int NICKNAME_MIN = 4; | ||
| public static final int PASSWORD_MAX = 16; | ||
| public static final int PASSWORD_MIN = 4; | ||
| } |
There was a problem hiding this comment.
하드코딩된 검증 값: 길이 제한이 상수로 고정되어 있습니다. 향후 변경 시 코드 수정이 필요하고, 외부 설정으로 관리되지 않습니다. 가능하면 데이터베이스나 설정 파일에서 로드하는 방식을 고려하세요.
| public User() { | ||
| } |
There was a problem hiding this comment.
ORM 패턴 일관성: 기본 생성자를 추가했는데, 이는 보통 ORM(Hibernate 등)의 리플렉션 기반 인스턴스화를 위해 필요합니다. 다른 엔티티도 동일하게 기본 생성자를 가지고 있는지 확인하세요. 불완전한 상태로 객체가 생성되지 않도록 접근 제어(private 또는 package-private)를 고려하세요.
💻 작업 내용
🎯 관련 이슈
closed #65