Skip to content

Conversation

@songsunkook
Copy link

프로젝트 경로에 한글 또는 띄어쓰기가 포함되어 있을 시 transaction Stage1Test에서 schema.sql 경로를 인식하지 못하는 문제를 수정했습니다.

11:40:27.144 [Test worker] ERROR transaction.DatabasePopulatorUtils -- /Users/username/%eb%82%b4%20%eb%93%9c%eb%9d%bc%ec%9d%b4%eb%b8%8c/java-jdbc/study/build/resources/main/schema.sql

// 실제 경로: /Users/username/내 드라이브/java-jdbc/study/build/resources/main/schema.sql

@songsunkook songsunkook self-assigned this Oct 2, 2025
@coderabbitai
Copy link

coderabbitai bot commented Oct 2, 2025

Walkthrough

이 변경은 study/src/main/java/transaction/DatabasePopulatorUtils.java와 app/src/main/java/com/techcourse/support/jdbc/init/DatabasePopulatorUtils.java에서 파일 경로 처리 방식을 URL 기반에서 URI 기반으로 전환했습니다. URL로부터 File 생성 시 url.getFile() 대신 url.toURI()를 사용하도록 수정했으며, java.net.URISyntaxException을 import하고 해당 예외를 기존의 예외 처리에 추가하여 catch하도록 변경했습니다. 공개 또는 내보내는 엔터티의 선언 변경은 없습니다.

Pre-merge checks

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed 제목은 transaction.Stage1Test에서 발생한 경로 인식 버그 수정을 명확하게 요약하고 있으며 불필요한 단어나 이모지가 없이 변경의 핵심을 잘 전달하고 있습니다.
Description Check ✅ Passed 설명에서는 한글 및 공백 포함 경로에서 schema.sql을 인식하지 못하는 문제와 실제 로그 예시를 제시하여 수정 대상과 맥락을 분명히 전달하고 있어 변경 사항과 잘 부합합니다.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
study/src/main/java/transaction/DatabasePopulatorUtils.java (1)

19-44: 메서드 구조 개선을 고려해보시면 좋겠습니다.

현재 execute() 메서드를 객체지향 생활 체조 원칙 관점에서 살펴보면:

규칙 1 (한 메서드에 오직 한 단계의 들여쓰기만) 📏

  • 현재 들여쓰기 깊이가 최대 3단계입니다 (try → finally → try)
  • 복잡도가 높아져 메서드의 의도를 파악하기 어렵습니다

규칙 6 (모든 엔티티를 작게 유지 - 메서드 10줄 이하) 📦

  • 현재 약 25줄로 권장 크기를 초과합니다
  • 한 메서드가 너무 많은 일을 하고 있지 않나요?

생각해볼 점:

  1. 메서드가 하는 일들을 나열해보면:

    • schema.sql 파일 찾기
    • 파일 내용 읽기
    • DB 연결 생성
    • SQL 실행
    • 리소스 정리

    이 중 일부를 별도 메서드로 분리하면 어떨까요?

  2. 리소스 관리:

    • Java 7부터 제공되는 try-with-resources를 사용하면 finally 블록의 복잡한 정리 코드를 제거할 수 있습니다
    • ConnectionStatementAutoCloseable을 구현하고 있다는 점을 활용해보세요
  3. 메서드 분해 힌트:

    execute()
      ↓
    loadSqlScript() - 파일 찾기 + 읽기
    executeSql(String sql) - DB 연결 + 실행
    

    이런 식으로 나누면 각 메서드의 책임이 명확해지고, 테스트하기도 쉬워집니다.

질문:

  • 메서드를 작게 유지하는 것이 왜 중요할까요?
  • try-with-resources를 사용하면 코드가 어떻게 달라질까요?
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 555788a and 7d79ba7.

📒 Files selected for processing (1)
  • study/src/main/java/transaction/DatabasePopulatorUtils.java (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 🎯 코드 품질 중심 리뷰 가이드라인

이 리뷰는 코드 품질과 객체지향 원칙에 집중합니다.
미션 달성 여부가 아닌, 코드 설계와 품질 개선에 대한 피드백을 한글로 제공해주세요.

📚 학습 원칙

  • 직접 코드를 제공하지 마세요 (학습자가 명시적으로 요청하는 경우 제외)
  • 문제 해결 과정을 안내하되, 정답을 바로 알려주지 마세요
  • 작은 단계로 문제를 분해하여 접근하도록 도와주세요

💡 피드백 방법

  • 유도 질문 활용: "만약 ~라면 어떻게 될까요?", "~를 고려해보셨나요?"
  • 힌트 제공: 방향은 제시하되, 구체적인 구현은 학습자가 하도록
  • 다양한 접근법 제시: 한 가지 해결책이 아닌 여러 가능성을 제안
  • 왜?에 집중: 단순히 무엇이 잘못되었는지보다 왜 그런지 이해하도록

⚡ 객체지향 생활 체조 원칙 검토

다음은 객체지향 생활 체조(Object Calisthenics) 9가지 원칙입니다.
위반 시 학습 효과를 위해 반드시 피드백을 제공하되, 왜 이 원칙이 중요한지 설명해주세요:

규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만

  • 들여쓰기 depth 최대 1 (중첩 제어구조 금지)
    • 📖 이유: 메서드 복잡도 감소, 단일 책임 원칙 강화
    • 💡 힌트: "이 부분을 별도 메서드로 추출하면 어떨까요?"

규칙 2: else 예약어 금지

  • else, switch/case 사용 금지
    • 📖 이유: 복잡한 분기 제거, 명확한 코드 흐름
    • 💡 힌트: "early return이나 가드 클로즈 패턴을 고려해보세요"

규칙 3: 모든 원시값과 문자열 포장

  • 원시 타입과 String을 객체로 포장
    • 📖 이유: 도메인 개념 명확화, 비즈니스 로직 응집
    • 💡 예시: int portPort port, String nameName name

규칙 4: 한 줄에 점 하나만 (디미터 법칙)

  • 메서드 체이닝 제한
    • 📖 이유: 결합도 감소, 캡슐화 향상
    • 💡 나쁜 예: request.getUri().getPath().substring()
    • 💡 좋은 예: request.extractPath()

규칙 5: 축약 금지

  • 명확한 이름 사용 (축약어 금지)
    • 📖 이유: 코드 가독성, 의도 명확화
    • 💡 예시: reqrequest, calcAmtcalculateAmount

규칙 6: 모든 엔티티를 작게 유지

  • 클래스 50줄, 메서드 10줄 이하
    • 📖 이유: 단일 책임, 이해와 테스트 용이성
    • 💡 힌트: "이 클래스가 너무 많은 일을 하고 있지 않나요?"

규칙 7: 인스턴스 변수 3개 이하

  • 클래스당 최대 3개의 인스턴스 변수
    • 📖 이유: 높은 응집도, 단일 책임 유지
    • 💡 힌트: "관련 필드들을 별도 객체로 묶을 수 있을까요?"

규칙 8: 일급 컬렉션 사용

  • 컬렉션을 감싸는 클래스 사용
    • 📖 이유: 컬렉션 로직 캡슐화, 불변성 보장
    • 💡 예시: List<HttpHeader>HttpHeaders 클래스

규칙 9: 게터/세터/프로퍼티 금지

  • Tell, Don't Ask 원칙 준수
    • 📖 이유: 진정한 캡슐화, 객체 자율성
    • 💡 나쁜 예: if (user.getPassword().equals(input))
    • 💡 좋은 예: if (user.authenticate(input))

🎯 추가 프로그래밍 요구사항

코드 스타일

  • Java Style Guide 준수
  • 3항 연산자 사용 금지

테스트 및 구조

  • **모든 기능 T...

Files:

  • study/src/main/java/transaction/DatabasePopulatorUtils.java
🔇 Additional comments (2)
study/src/main/java/transaction/DatabasePopulatorUtils.java (2)

9-9: 한글/공백 경로 문제를 올바르게 해결했습니다! 👍

URL.getFile()은 URL 인코딩된 문자열을 그대로 반환하기 때문에 한글이나 공백이 %20, %eb%82%b4 같은 형태로 남아있어 파일 시스템에서 인식하지 못했습니다. url.toURI()를 사용하면 이러한 인코딩이 올바르게 디코딩되어 실제 파일 경로로 변환됩니다.

버그의 원인을 정확히 파악하고 적절한 해결책을 적용하셨네요!

Also applies to: 24-24


29-30: 예외 처리를 추가하셨네요.

toURI() 호출로 인한 URISyntaxException을 처리하신 것은 좋습니다.

다만 한 가지 생각해볼 점이 있습니다:

  • 현재 NullPointerException, IOException, SQLException, URISyntaxException을 모두 동일하게 처리하고 있는데요
  • 이 예외들은 각각 다른 의미를 가지고 있습니다 (리소스 없음, 파일 I/O 실패, DB 연결 실패, URI 형식 오류)

질문:

  1. 이렇게 서로 다른 성격의 예외들을 한 곳에서 동일하게 처리하는 것이 적절할까요?
  2. 만약 schema.sql 파일 로딩이 실패한다면, 이 유틸리티를 호출한 쪽에서는 어떻게 알 수 있을까요?
  3. 예외를 로깅만 하고 삼켜버리면(caller에게 전파하지 않으면) 어떤 문제가 생길 수 있을까요?

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
app/src/main/java/com/techcourse/support/jdbc/init/DatabasePopulatorUtils.java (1)

20-45: 리소스 관리와 메서드 분해를 고려해보시면 좋을 것 같습니다.

현재 코드는 의도한 버그를 잘 수정했지만, 몇 가지 개선 기회가 있습니다:

  1. try-with-resources 활용: Java 7 이후로는 ConnectionStatement 같은 AutoCloseable 리소스를 자동으로 닫아주는 try-with-resources 문법을 사용할 수 있습니다. 현재의 명시적 finally 블록과 빈 catch 블록을 제거할 수 있습니다.

  2. 메서드 길이와 책임 분리: execute 메서드가 여러 가지 일을 하고 있습니다 (파일 로드, SQL 읽기, 실행, 연결 관리). 각 책임을 별도 메서드로 분리하면 어떨까요?

  3. NullPointerException 처리: NullPointerException을 catch하는 것보다는, null 체크를 통해 미리 방지하는 것이 더 좋은 방식입니다. 어떤 상황에서 NPE가 발생할 수 있을지 생각해보셨나요?

이러한 개선사항들은 지금 당장 적용하지 않아도 되지만, 향후 코드 품질 향상을 위해 고려해볼 만한 포인트들입니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7d79ba7 and d90ead9.

📒 Files selected for processing (1)
  • app/src/main/java/com/techcourse/support/jdbc/init/DatabasePopulatorUtils.java (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 🎯 코드 품질 중심 리뷰 가이드라인

이 리뷰는 코드 품질과 객체지향 원칙에 집중합니다.
미션 달성 여부가 아닌, 코드 설계와 품질 개선에 대한 피드백을 한글로 제공해주세요.

📚 학습 원칙

  • 직접 코드를 제공하지 마세요 (학습자가 명시적으로 요청하는 경우 제외)
  • 문제 해결 과정을 안내하되, 정답을 바로 알려주지 마세요
  • 작은 단계로 문제를 분해하여 접근하도록 도와주세요

💡 피드백 방법

  • 유도 질문 활용: "만약 ~라면 어떻게 될까요?", "~를 고려해보셨나요?"
  • 힌트 제공: 방향은 제시하되, 구체적인 구현은 학습자가 하도록
  • 다양한 접근법 제시: 한 가지 해결책이 아닌 여러 가능성을 제안
  • 왜?에 집중: 단순히 무엇이 잘못되었는지보다 왜 그런지 이해하도록

⚡ 객체지향 생활 체조 원칙 검토

다음은 객체지향 생활 체조(Object Calisthenics) 9가지 원칙입니다.
위반 시 학습 효과를 위해 반드시 피드백을 제공하되, 왜 이 원칙이 중요한지 설명해주세요:

규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만

  • 들여쓰기 depth 최대 1 (중첩 제어구조 금지)
    • 📖 이유: 메서드 복잡도 감소, 단일 책임 원칙 강화
    • 💡 힌트: "이 부분을 별도 메서드로 추출하면 어떨까요?"

규칙 2: else 예약어 금지

  • else, switch/case 사용 금지
    • 📖 이유: 복잡한 분기 제거, 명확한 코드 흐름
    • 💡 힌트: "early return이나 가드 클로즈 패턴을 고려해보세요"

규칙 3: 모든 원시값과 문자열 포장

  • 원시 타입과 String을 객체로 포장
    • 📖 이유: 도메인 개념 명확화, 비즈니스 로직 응집
    • 💡 예시: int portPort port, String nameName name

규칙 4: 한 줄에 점 하나만 (디미터 법칙)

  • 메서드 체이닝 제한
    • 📖 이유: 결합도 감소, 캡슐화 향상
    • 💡 나쁜 예: request.getUri().getPath().substring()
    • 💡 좋은 예: request.extractPath()

규칙 5: 축약 금지

  • 명확한 이름 사용 (축약어 금지)
    • 📖 이유: 코드 가독성, 의도 명확화
    • 💡 예시: reqrequest, calcAmtcalculateAmount

규칙 6: 모든 엔티티를 작게 유지

  • 클래스 50줄, 메서드 10줄 이하
    • 📖 이유: 단일 책임, 이해와 테스트 용이성
    • 💡 힌트: "이 클래스가 너무 많은 일을 하고 있지 않나요?"

규칙 7: 인스턴스 변수 3개 이하

  • 클래스당 최대 3개의 인스턴스 변수
    • 📖 이유: 높은 응집도, 단일 책임 유지
    • 💡 힌트: "관련 필드들을 별도 객체로 묶을 수 있을까요?"

규칙 8: 일급 컬렉션 사용

  • 컬렉션을 감싸는 클래스 사용
    • 📖 이유: 컬렉션 로직 캡슐화, 불변성 보장
    • 💡 예시: List<HttpHeader>HttpHeaders 클래스

규칙 9: 게터/세터/프로퍼티 금지

  • Tell, Don't Ask 원칙 준수
    • 📖 이유: 진정한 캡슐화, 객체 자율성
    • 💡 나쁜 예: if (user.getPassword().equals(input))
    • 💡 좋은 예: if (user.authenticate(input))

🎯 추가 프로그래밍 요구사항

코드 스타일

  • Java Style Guide 준수
  • 3항 연산자 사용 금지

테스트 및 구조

  • **모든 기능 T...

Files:

  • app/src/main/java/com/techcourse/support/jdbc/init/DatabasePopulatorUtils.java
🔇 Additional comments (1)
app/src/main/java/com/techcourse/support/jdbc/init/DatabasePopulatorUtils.java (1)

5-5: 한글 경로 인코딩 문제를 정확하게 해결했습니다!

url.getFile() 대신 url.toURI()를 사용하는 것은 URL 인코딩된 경로를 처리하는 올바른 방법입니다. 이 변경으로 한글이나 공백이 포함된 경로에서도 schema.sql 파일을 정확히 인식할 수 있게 되었습니다.

  • url.getFile(): URL 인코딩된 문자열을 그대로 반환 (예: /내 드라이브//%eb%82%b4%20%eb%93%9c%eb%9d%bc%ec%9d%b4%eb%b8%8c/)
  • url.toURI(): URL 디코딩을 수행하여 실제 경로로 변환

URISyntaxException을 catch 블록에 추가한 것도 적절합니다.

Also applies to: 25-25, 30-30

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant