-
Notifications
You must be signed in to change notification settings - Fork 0
BE 코드 컨벤션
변수, 메소드, 인스턴스를 작성할 때는 기본적으로 “Camel Case(카멜 케이스)”를 사용합니다.
ex) camelCase
변수명을 작성할 때는 “lower CamelCase(소문자 카멜 케이스)”를 사용합니다.
Reservation reservation;
Queue<Integer> queue = new PriorityQueue<>();
메소드 블록 범위 이상의 생명 주기를 가지는 변수에는 1글자 이름을 사용하지 않습니다.
Reservation r = new Reservation(); // (x)
Reservation reservation = new Reservation(); // (o)
반복문(for
, while
)의 인덱스나 람다 표현식의 파라미터 등의 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있습니다.
int max = Arrays.stream(intArray).
boxed().map(e -> 2 * e + 1).
max(Integer::compareTo).
get();
for (int e : intArray) {
...
}
메소드명을 작성할 때는 동사 + 명사 형태로 구성합니다.
void int getTotalAmount() { ... }
Class, Constructor를 작성할 때는 “Pascal Case(=upper 카멜 케이스)”를 사용합니다.
public class CamelCase { ... }
글자의 길이는 20자 이내로 제한합니다. 4단어 이상이 들어가거나, 부득이하게 20자 이상이 되는 경우 팀원과 상의를 거칩니다.
플래그(Flag)란 ‘깃발’이란 의미이지만, 프로그래밍에서는 ‘상태를 기록하고 처리 흐름을 제어하기 위한 boolean
변수’를 의미합니다.
이러한 변수는 조동사 + flag 종류로 구성됩니다.
ex) isNum, hasNum
약어는 가능하면 사용하지 않습니다. 길이 초과 등 부득이하게 약어가 필요한 상황에서는 팀원과의 상의를 거친 후 결정합니다.
int idx; // (x)
int index; // (o)
int cnt; // (x)
int count; // (o)
추상체(인터페이스)를 구현하는 구현체(구현 클래스)명은 (인터페이스명) + Impl
입니다. 이 경우엔 약칭의 사용을 허용합니다.
public interface PaymentController {
...
}
public class PaymentControllerImpl implements PaymentController {
...
]
(엔티티명) + Repository/Controller/Service
입니다. 이들은 절대로 약칭을 사용하지 않습니다.
public class Payment {
...
}
public class PaymentRepository {
...
}
public class PaymentService {
...
}
public class PaymentController {
...
}
DTO가 요청/응답 중 어떤 상황에서 어떤 역할에서 사용되는지를 반드시 나타내야 합니다. 기본적으로 매핑에 사용되는 DTO인 경우 (엔티티명) + (역할) + Request/Response/Dto
형태로 작명합니다.
public class PaymentConfirmRequest {
...
}
요청 DTO
(엔티티명) + (역할) + Request
로 합니다.
e.g. 주문 조회 요청 DTO : OrderHistoryRequest
Repository에서 사용되는 DTO
(엔티티명) + (역할) + Dto
로 합니다.
e.g. 주문 조회 DTO : OrderHistoryDto
응답 DTO
(엔티티명) + (역할) + Response
로 합니다.
e.g. 주문 조회 응답 DTO : OrderHistoryResponse
특정 엔티티와 직접적으로 매핑되지 않는 DTO인 경우 이름에 역할 + Request/Response/Dto
만 명시합니다. 만약, 엔티티 작명이 애매한 경우 팀원들과 논의 후 결정합니다.
// 무이자 할부 정보 DTO
public class FreeInstallmentPlanDto {
@ApiModelProperty(value = "할부를 적용할 카드사 코드")
private String company;
@ApiModelProperty(value = "무이자를 적용할 할부 개월 정보")
private List<Integer> months;
}
엔티티와 관련된 열거체나 별도의 클래스명은 (엔티티명) + 기능이름
입니다. 기능이름을 통해 해당 클래스나 열거체가 어떤 역할을 하는지 알 수 있어야 합니다. 글자 수 제한등 필요에 따라 약어를 사용할 수 있습니다.
변수, 메소드, 인스턴스를 작성할 때는 기본적으로 “Camel Case(카멜 케이스)”를 사용합니다.
ex) camelCase
변수명을 작성할 때는 “lower CamelCase(소문자 카멜 케이스)”를 사용합니다.
Reservation reservation;
Queue<Integer> queue = new PriorityQueue<>();
메소드 블록 범위 이상의 생명 주기를 가지는 변수에는 1글자 이름을 사용하지 않습니다.
Reservation r = new Reservation(); // (x)
Reservation reservation = new Reservation(); // (o)
반복문(for
, while
)의 인덱스나 람다 표현식의 파라미터 등의 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있습니다.
int max = Arrays.stream(intArray).
boxed().map(e -> 2 * e + 1).
max(Integer::compareTo).
get();
for (int e : intArray) {
...
}
메소드명을 작성할 때는 동사 + 명사 형태로 구성합니다.
void int getTotalAmount() { ... }
Class, Constructor를 작성할 때는 “Pascal Case(=upper 카멜 케이스)”를 사용합니다.
public class CamelCase { ... }
글자의 길이는 20자 이내로 제한합니다. 4단어 이상이 들어가거나, 부득이하게 20자 이상이 되는 경우 팀원과 상의를 거칩니다.
플래그(Flag)란 ‘깃발’이란 의미이지만, 프로그래밍에서는 ‘상태를 기록하고 처리 흐름을 제어하기 위한 boolean
변수’를 의미합니다.
이러한 변수는 조동사 + flag 종류로 구성됩니다.
ex) isNum, hasNum
약어는 가능하면 사용하지 않습니다. 길이 초과 등 부득이하게 약어가 필요한 상황에서는 팀원과의 상의를 거친 후 결정합니다.
int idx; // (x)
int index; // (o)
int cnt; // (x)
int count; // (o)
추상체(인터페이스)를 구현하는 구현체(구현 클래스)명은 (인터페이스명) + Impl
입니다. 이 경우엔 약칭의 사용을 허용합니다.
public interface PaymentController {
...
}
public class PaymentControllerImpl implements PaymentController {
...
]
(엔티티명) + Repository/Controller/Service
입니다. 이들은 절대로 약칭을 사용하지 않습니다.
public class Payment {
...
}
public class PaymentRepository {
...
}
public class PaymentService {
...
}
public class PaymentController {
...
}
DTO가 요청/응답 중 어떤 상황에서 어떤 역할에서 사용되는지를 반드시 나타내야 합니다. 기본적으로 매핑에 사용되는 DTO인 경우 (엔티티명) + (역할) + Request/Response/Dto
형태로 작명합니다.
public class PaymentConfirmRequest {
...
}
요청 DTO
(엔티티명) + (역할) + Request
로 합니다.
e.g. 주문 조회 요청 DTO : OrderHistoryRequest
Repository에서 사용되는 DTO
(엔티티명) + (역할) + Dto
로 합니다.
e.g. 주문 조회 DTO : OrderHistoryDto
응답 DTO
(엔티티명) + (역할) + Response
로 합니다.
e.g. 주문 조회 응답 DTO : OrderHistoryResponse
특정 엔티티와 직접적으로 매핑되지 않는 DTO인 경우 이름에 역할 + Request/Response/Dto
만 명시합니다. 만약, 엔티티 작명이 애매한 경우 팀원들과 논의 후 결정합니다.
// 무이자 할부 정보 DTO
public class FreeInstallmentPlanDto {
@ApiModelProperty(value = "할부를 적용할 카드사 코드")
private String company;
@ApiModelProperty(value = "무이자를 적용할 할부 개월 정보")
private List<Integer> months;
}
엔티티와 관련된 열거체나 별도의 클래스명은 (엔티티명) + 기능이름
입니다. 기능이름을 통해 해당 클래스나 열거체가 어떤 역할을 하는지 알 수 있어야 합니다. 글자 수 제한등 필요에 따라 약어를 사용할 수 있습니다.
변수, 메소드, 인스턴스를 작성할 때는 기본적으로 “Camel Case(카멜 케이스)”를 사용합니다.
ex) camelCase
변수명을 작성할 때는 “lower CamelCase(소문자 카멜 케이스)”를 사용합니다.
Reservation reservation;
Queue<Integer> queue = new PriorityQueue<>();
메소드 블록 범위 이상의 생명 주기를 가지는 변수에는 1글자 이름을 사용하지 않습니다.
Reservation r = new Reservation(); // (x)
Reservation reservation = new Reservation(); // (o)
반복문(for
, while
)의 인덱스나 람다 표현식의 파라미터 등의 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있습니다.
int max = Arrays.stream(intArray).
boxed().map(e -> 2 * e + 1).
max(Integer::compareTo).
get();
for (int e : intArray) {
...
}
메소드명을 작성할 때는 동사 + 명사 형태로 구성합니다.
void int getTotalAmount() { ... }
Class, Constructor를 작성할 때는 “Pascal Case(=upper 카멜 케이스)”를 사용합니다.
public class CamelCase { ... }
글자의 길이는 20자 이내로 제한합니다. 4단어 이상이 들어가거나, 부득이하게 20자 이상이 되는 경우 팀원과 상의를 거칩니다.
플래그(Flag)란 ‘깃발’이란 의미이지만, 프로그래밍에서는 ‘상태를 기록하고 처리 흐름을 제어하기 위한 boolean
변수’를 의미합니다.
이러한 변수는 조동사 + flag 종류로 구성됩니다.
ex) isNum, hasNum
약어는 가능하면 사용하지 않습니다. 길이 초과 등 부득이하게 약어가 필요한 상황에서는 팀원과의 상의를 거친 후 결정합니다.
int idx; // (x)
int index; // (o)
int cnt; // (x)
int count; // (o)
추상체(인터페이스)를 구현하는 구현체(구현 클래스)명은 (인터페이스명) + Impl
입니다. 이 경우엔 약칭의 사용을 허용합니다.
public interface PaymentController {
...
}
public class PaymentControllerImpl implements PaymentController {
...
]
(엔티티명) + Repository/Controller/Service
입니다. 이들은 절대로 약칭을 사용하지 않습니다.
public class Payment {
...
}
public class PaymentRepository {
...
}
public class PaymentService {
...
}
public class PaymentController {
...
}
DTO가 요청/응답 중 어떤 상황에서 어떤 역할에서 사용되는지를 반드시 나타내야 합니다. 기본적으로 매핑에 사용되는 DTO인 경우 (엔티티명) + (역할) + Request/Response/Dto
형태로 작명합니다.
public class PaymentConfirmRequest {
...
}
요청 DTO
(엔티티명) + (역할) + Request
로 합니다.
e.g. 주문 조회 요청 DTO : OrderHistoryRequest
Repository에서 사용되는 DTO
(엔티티명) + (역할) + Dto
로 합니다.
e.g. 주문 조회 DTO : OrderHistoryDto
응답 DTO
(엔티티명) + (역할) + Response
로 합니다.
e.g. 주문 조회 응답 DTO : OrderHistoryResponse
특정 엔티티와 직접적으로 매핑되지 않는 DTO인 경우 이름에 역할 + Request/Response/Dto
만 명시합니다. 만약, 엔티티 작명이 애매한 경우 팀원들과 논의 후 결정합니다.
// 무이자 할부 정보 DTO
public class FreeInstallmentPlanDto {
@ApiModelProperty(value = "할부를 적용할 카드사 코드")
private String company;
@ApiModelProperty(value = "무이자를 적용할 할부 개월 정보")
private List<Integer> months;
}
엔티티와 관련된 열거체나 별도의 클래스명은 (엔티티명) + 기능이름
입니다. 기능이름을 통해 해당 클래스나 열거체가 어떤 역할을 하는지 알 수 있어야 합니다. 글자 수 제한등 필요에 따라 약어를 사용할 수 있습니다.
// Payment 엔티티의 결제 수단에 사용되는 열거체
public enum PaymentMethod {
...
}
// Reservation 엔티티의 예약 상태에 사용되는 열거체
public enum ReservationStatus {
...
}
클래스, 필드, 메소드, 변수값, import 문 등의 소스 구성요소를 선언할 때 고려해야 할 규칙입니다.
클래스를 import 할 때는 반드시 와일드카드(*) 없이 모든 클래스명을 다 써야 합니다.
// Bad
import java.util.*;
// Good
import java.util.ArrayList;
import java.util.List;
- Intellij의 환경 설정에서 와일드카드를 사용할 최소 import 개수 제한을 아주 큰 값으로 설정하면 자동으로 와일드카드가 사용되는 것을 방지할 수 있습니다.
static import에서는 와일드카드(*)를 사용해도 됩니다.
import static java.lang.Math.*;
클래스, 메소드, 인스턴스 변수의 제한자는 Java Lauguage Specification에서 명시한 아래의 순서를 준수합니다.
public protected private abstract static final transient volatile synchronized native strictfp
배열 선언 뒤에 오는 대괄호([]
)는 타입의 바로 뒤에 붙입니다. 대괄호를 변수명 바로 뒤에 붙이는 C언어 스타일을 사용하지 않습니다.
String[] names; // (o)
String names[]; // (x)
long
또는 Long
타입 값에는 마지막에 대문자 ‘L’을 붙입니다. 소문자 대신 대문자를 사용하는 이유는 ‘l’은 숫자 ‘1’과 유사하기 때문에 헷갈릴 우려가 있기 때문입니다.
long base = 12345L; // (o)
long base = 12345; // (x)
tab의 최대 depth는 3으로 제한합니다. 이를 초과할 시 메소드를 분리하도록 합니다. 그 이상으로 개선되기 힘들다고 판단되는 경우, 팀원들과 코드 리뷰를 통해 개선합니다.
void func() {
// tab1
if (...) {
// tab2
queue.stream()
// tab3
.filter(e -> {
if (...) {
// tab4
}
})
...
}
...
}
...
}
중괄호는 클래스, 메소드, 제어문의 블록을 구분합니다.
클래스 선언, 메소드 선언, 조건/반복문 등의 코드 블록을 감싸는 중괄호에 적용되는 규칙입니다. 중괄호 선언은 K&R 스타일(Kernighan and Ritchie style)을 준수합니다.
- 줄의 마지막에는 시작 중괄호 (
{
)를 쓰고 열고 새줄을 삽입한다. - 블록을 마친 후에는 새줄 삽입 후 중괄호를 닫는다.
public class PaymentController {
public String createPayment(String paymentId) {
if (paymentId == null) {
return null;
}
for (char c : paymentId.toCharArray()) {
...
}
return "payment.html";
}
}
- 여기서
while
은do-while
문에서의while
을 의미합니다.
// Good
if (line.startWith(WARNING_PREFIX)) {
return LogPattern.WARN;
} else if (line.startWith(DANGER_PREFIX)) {
return LogPattern.NORMAL;
} else {
return LogPattern.NORMAL;
}
try {
writeLog();
} catch (IOException ioe) {
reportFailure(ioe);
} finally {
writeFooter();
}
do {
write(line);
line = readLine();
} while (line != null);
// Bad
if (line.startWith(WARNING_PREFIX)) {
return LogPattern.WARN;
}
else if (line.startWith(DANGER_PREFIX)) {
return LogPattern.DANGER;
}
else {
return LogPattern.NORMAL;
}
try {
writeLog();
}
catch (IOException ioe) {
reportFailure(ioe);
}
finally {
writeFooter();
}
do {
write(line);
line = readLine();
}
while (line != null);
내용이 없는 블록을 선언할 때는 같은 줄에서 중괄호를 닫는 것을 허용합니다.
public void close() {}
조건/반복문의 실행문이 한 줄로 끝나도 중괄호를 사용합니다. 이 문서에 언급된 중괄호에 대한 규칙을 반드시 고려합니다.
// Good
if (paymentId == null) {
return false;
}
for (int i = 0; i < intArray.length; i++) {
System.out.println(intArray[i]);
}
// Bad
if (paymentId == null) return false;
for (int i = 0; i < intArray.length; i++)
System.out.println(intArray[i])
불가피한 경우를 제외하고 else if 의 사용을 최소화합니다. ex) 조건을 만족하면 탈출하는 if문으로 대체
if (a > b) {
...
} else if (b > a) { // (x)
...
}
if (a > b) {
...
} else { // (o)
...
}
메소드 파라미터의 개수는 최대 3개까지 사용하는 것을 지향합니다. 부득이하게 4개 이상을 사용해야 하는 경우 반드시 충분한 설명력을 갖는 파라미터명을 사용해야 합니다.
void func(int a, int b, int c, int b) { // (x)
...
}
void func(int a, int b, int c, int b) { // (o)
...
}
하나의 메소드가 20줄을 넘어가지 않도록 합니다. 메소드 이름을 작명할 때 And
키워드가 들어간다면, 여러 개의 메소드로 쪼갤 수 있다는 신호입니다.
비즈니스 로직은 순수 함수로 만듭니다. DB나 global 변수에 의존하지 않도록 합니다.
Ealry Return을 적극적으로 활용하고 메소드를 최대한 잘게 쪼개서 Indent를 줄입니다. Indent가 많아지면 코드의 가독성이 현저히 떨어집니다.
참고) https://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/
DTO → 다른 DTO 또는 엔티티, 다른 DTO 또는 엔티티 → DTO 변환시 사용되는 메서드 입니다.
파라미터 수에 따라 메서드명이 결정됩니다.
파라미터가 한 개인 경우
파라미터가 1개라면 메서드명으로 from
로 합니다.
public class BookmarkDto {
private String userProfileName;
private String trainerName;
private String trainerId;
private Long id;
public static BookmarkDto from(final Bookmark bookmark) {
return new BookmartDto(
bookmark.getId(),
bookMark.getTrainer().getUserProfile().getName(),
bookMark.getTrainer().getId(),
bookMark.getUserProfile().getName()
);
}
}
파라미터가 여러 개인 경우
파라미터가 2개 이상이라면 메서드명을 of
로 합니다.
public class BookmarkDto {
private Long id;
private String trainerName;
private String trainerId;
public static BookmarkDto of(final Bookmark bookmark, final Trainer trainer) {
return new BookmartDto(
bookmark.getId(),
trainer.getName(),
trainer.getId()
);
}
}
도메인형 패키지 구조를 사용합니다.
common
⎿ config
⎿ exception
⎿ dto
⎿ domain
⎿ util
⎿ filter
product
⎿ controller
⎿ service
⎿ repository
⎿ dto
⎿ inquiry
⎿ dto
⎿ request
⎿ response
⎿ detail
⎿ dto
⎿ request
⎿ response
member
⎿ controller
⎿ service
⎿ repository
⎿ dto
⎿ login
⎿ dto
⎿ request
⎿ response
⎿ reissue
⎿ dto
⎿ request
⎿ response
cart
⎿ controller
⎿ service
⎿ repository
⎿ dto