코드 스타일

Java 코드 포맷팅, 제어문 스타일 가이드

마지막 수정: 2026-05

코드 스타일

기본 설정

  • 들여쓰기: 스페이스 4칸
  • 최대 줄 길이: 120자
  • 파일 인코딩: UTF-8
  • 줄 끝: LF (Unix)
  • 파일 끝 빈 줄 1개

if Statement

  • 단일 라인이라도 블록 {} 선언 필수
  • if 다음 공백 없음
// 올바른 예 — 중괄호 필수
if (condition) {
    doSomething();
}

// 잘못된 예 — 중괄호 생략 금지
if (condition)
    doSomething();  // 금지

// 올바른 예 — if 다음 공백 없음
if (userId != null) {
    // ...
}

// 잘못된 예 — if 다음 공백 금지
if  (userId != null) {  // 금지 (공백 2개)
    // ...
}

for Statement

  • index를 사용하지 않을 경우 향상된 for문(enhanced for) 사용
// 올바른 예 — index 미사용 시 향상된 for문
for (UserVo user : userList) {
    processUser(user);
}

// 잘못된 예 — index 불필요한데 기본 for문 사용
for (int i = 0; i < userList.size(); i++) {
    processUser(userList.get(i));  // index 미사용
}

// 올바른 예 — index가 필요한 경우 기본 for문 허용
for (int i = 0; i < userList.size(); i++) {
    userList.get(i).setOrder(i + 1);  // index 사용
}

while / do-while Statement

  • for문으로 가능하면 for문을 사용한다
// 올바른 예 — 반복 횟수가 정해진 경우 for문 사용
for (int i = 0; i < MAX_RETRY; i++) {
    if (tryAction()) break;
}

// while — 종료 조건이 불명확한 경우에만 사용
while (!queue.isEmpty()) {
    process(queue.poll());
}

// do-while — 최소 1회 실행이 보장되어야 하는 경우에만 사용
do {
    result = readLine();
} while (result != null);

switch Statement

  • default 필수
  • 내용이 없어도 break 기술
  • 한 라인에 case 하나만
// 올바른 예
switch (status) {
    case "A":
        handleActive();
        break;
    case "I":
        handleInactive();
        break;
    case "D":
        handleDeleted();
        break;
    default:
        break;  // 내용이 없어도 break 기술
}

// 잘못된 예 — default 누락
switch (status) {
    case "A":
        handleActive();
        break;
    case "I":
        handleInactive();
        break;
    // default 없음 — 금지!
}

// 잘못된 예 — 한 라인에 case 여러 개 금지
switch (type) {
    case "A": case "B":  // 금지!
        handle();
        break;
}

임포트 순서

// 1. java.*
import java.io.IOException;
import java.util.List;

// 2. javax.* / jakarta.*
import jakarta.annotation.PostConstruct;

// 3. org.*
import org.slf4j.Logger;
import org.springframework.stereotype.Service;

// 4. com.*
import com.{회사명}.{프로젝트명}.user.vo.UserVo;

// 와일드카드 임포트 금지: import java.util.*; → 개별 임포트

클래스 구조 순서

@Service
@RequiredArgsConstructor
@Slf4j
public class UserService {

    // 1. 상수 (static final)
    private static final int MAX_LOGIN_RETRY = 5;

    // 2. 필드 (의존성 → 상태)
    private final UserMapper userMapper;
    private final RedisManager redisManager;

    // 3. @PostConstruct / @PreDestroy
    @PostConstruct
    public void init() { }

    // 4. public 메서드
    @Transactional(readOnly = true)
    public UserVo get(UserVo vo) { ... }

    // 5. private 메서드
    private void validateUserId(String userId) { }
}

코드 포맷팅 규칙

공백

// 연산자 주위 공백
int result = a + b * c;
String key = "user:" + userSn;

// 쉼표 후 공백
List.of("a", "b", "c");
method(param1, param2);

// 메서드 이름과 괄호 사이 공백 없음
public void method() { }       // 올바름
public void method () { }      // 금지

줄 바꿈

// 체이닝: 줄당 하나
return ResponseEntity.ok()
        .header(HttpHeaders.CONTENT_DISPOSITION, disposition)
        .contentType(MediaType.APPLICATION_OCTET_STREAM)
        .body(data);

체크리스트

  • [ ] 스페이스 4칸 들여쓰기
  • [ ] 최대 120자 줄 길이
  • [ ] if 단일 라인도 중괄호 {} 필수
  • [ ] if 다음 공백 없음
  • [ ] index 미사용 시 향상된 for문 사용
  • [ ] switch: default 필수, break 항상 기술, 한 라인에 case 하나
  • [ ] 와일드카드 임포트 (import java.util.*) 금지
  • [ ] 커밋 전 Reformat Code (IntelliJ: Ctrl+Alt+L / Cmd+Alt+L)