코드 스타일
기본 설정
- 들여쓰기: 스페이스 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 (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)