+ 핵심 병목과 실행 가능한 개선안을 간결히 제시했다.
- 조건부 보안 언급은 성능 중심 범위에서 다소 벗어난다.
언어, 프레임워크, 집중 영역과 코드를 넣으면 품질, 스타일, 성능, 보안, 모범 사례 관점의 상세 피드백과 개선 제안을 받습니다.
| 분류 | 개발 › 코딩 |
|---|---|
| 태그 | 검토분석개발자코드템플릿 |
Act as a Code Review Expert. You are an experienced software developer with extensive knowledge in code analysis and improvement.
Your task is to review the code provided by the user, focusing on areas such as:
- Code quality and style
- Performance optimization
- Security vulnerabilities
- Compliance with best practices
You will:
- Provide detailed feedback and suggestions for improvement
- Highlight any potential issues or bugs
- Recommend best practices and optimizations
Rules:
- Ensure feedback is constructive and actionable
- Respect the language and framework provided by the user
${language} - Programming language of the code
${framework} - Framework (if applicable)
${focusArea:general} - Specific area to focus on (e.g., performance, security)제공된 코드를 리뷰하는 소프트웨어 개발자 역할 프롬프트다. 사용자가 준 언어와 프레임워크를 존중하고 건설적이고 실행 가능한 의견을 내도록 한다.
ChatGPT가 정확성과 분량의 균형이 가장 좋다. Gemini는 더 구체적이나 일부 과장과 장황함이 있고, [C]는 답이 없다.
+ 핵심 병목과 실행 가능한 개선안을 간결히 제시했다.
- 조건부 보안 언급은 성능 중심 범위에서 다소 벗어난다.
+ N+1과 전체 조회를 구체적 대안까지 분석했다.
- 리플리카 라우팅 단정과 과도한 분량이 아쉽다.
| 기준 | ChatGPT | Gemini | 앞선 모델 |
|---|---|---|---|
| 지시 준수 | 10 | 10 | 동점 |
| 정확성 | 9 | 8 | ChatGPT +13% |
| 구체성 | 9 | 10 | Gemini +11% |
| 구성·가독성 | 9 | 9 | 동점 |
| 분량 적정성 | 10 | 7 | ChatGPT +43% |
gpt-5.6-sol가 모델 이름을 가린 채 1~10점으로 채점했습니다 (2026-09-24). 측정값이 아니라 AI 심사 결과입니다.
같은 입력을 세 모델에 넣어 받은 답을 그대로 옮겼습니다. 각 CLI(에이전트 하네스)에서 실행했습니다. ChatGPT·Claude 앱이나 웹에서는 답이 다를 수 있습니다.
[붙여 넣은 자료]
언어: Java, 프레임워크: Spring Boot, 집중 영역: 성능(performance)
```java
@GetMapping("/orders")
public List<OrderDto> getOrders() {
List<Order> orders = orderRepository.findAll();
List<OrderDto> result = new ArrayList<>();
for (Order o : orders) {
Customer c = customerRepository.findById(o.getCustomerId()).orElseThrow();
result.add(new OrderDto(o.getId(), c.getName(), o.getTotal()));
}
return result;
}
```주요 문제는 주문 수만큼 고객 조회가 반복되는 N+1 쿼리입니다.
for (Order o : orders) {
customerRepository.findById(o.getCustomerId());
}
주문이 1,000개면 최소 1번의 주문 조회와 1,000번의 고객 조회가 발생할 수 있어 성능이 크게 저하됩니다.
개선 방향은 다음과 같습니다.
Order와 Customer를 조인한 조회 사용orElseThrow()의 예외를 명시적으로 처리예를 들어 Spring Data JPA에서는 DTO projection을 사용할 수 있습니다.
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query("""
select new com.example.api.OrderDto(
o.id,
c.name,
o.total
)
from Order o
join Customer c on c.id = o.customerId
order by o.id desc
""")
Page<OrderDto> findOrderDtos(Pageable pageable);
}
서비스와 컨트롤러는 다음처럼 분리할 수 있습니다.
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class OrderService {
private final OrderRepository orderRepository;
public Page<OrderDto> getOrders(Pageable pageable) {
return orderRepository.findOrderDtos(pageable);
}
}
@GetMapping("/orders")
public Page<OrderDto> getOrders(
@PageableDefault(size = 50, sort = "id", direction = Sort.Direction.DESC)
Pageable pageable
) {
return orderService.getOrders(pageable);
}
추가로 확인할 사항입니다.
findAll()은 주문이 많아질수록 메모리를 과도하게 사용할 수 있습니다.orElseThrow()는 고객 데이터가 없을 때 기본 예외가 노출될 수 있으므로 도메인 예외와 적절한 HTTP 상태 코드로 변환하는 것이 좋습니다.customerId를 직접 보유하는 구조라면 조인 조건을 명확히 관리해야 합니다. 가능하다면 Order와 Customer의 JPA 연관관계 및 join fetch 또는 projection 사용을 검토할 수 있습니다.가장 우선순위가 높은 개선은 findById() 반복을 제거하고, 페이지 단위의 조인 기반 DTO 조회로 변경하는 것입니다.
| 방산 CV 12개월 로드맵 프롬프트 | |
| 2046 퍼즐 게임 제작 프롬프트 | |
| React 컴포넌트 통합 프롬프트 | |
| 3D 아바타 팩토리 요구 프롬프트 | |
| 3D FPS 게임 개발 프롬프트 |