EditorConfig ์—์„œ K&R ์Šคํƒ€์ผ ๊ฐ•์ œํ•˜๊ธฐ

๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ธ€๋“ค์„ ์ฐธ๊ณ ํ•ด๋ณด๋‹ˆ ์ž๋ฐ” ์–ธ์–ด์—์„œ์˜ ๊ธฐ๋ณธ K&R ์ฝ”๋“œ ์Šคํƒ€์ผ์ด ์•„๋‹Œ BSD ์Šคํƒ€์ผ๋กœ ๋ฐ”๊พธ์–ด์„œ ๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‚˜๋ณด๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ EditorConfig๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ธํ…”๋ฆฌ์ œ์ด์—์„œ EditorConfig ์— ์˜ํ•ด IDE ์ฝ”๋“œ ์Šคํƒ€์ผ ์„ค์ •์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™œ์„ฑํ™” ํ–ˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

.editorconfig
[*.java] ij_java_block_brace_style = end_of_line ij_java_class_brace_style = end_of_line ij_java_method_brace_style = end_of_line ij_java_line_comment_add_space = true ij_java_line_comment_add_space_on_reformat = true ij_java_line_comment_at_first_column = false

์ด์™ธ์—๋„ ์ˆ˜ ๋งŽ์€ ๊ทœ์น™์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ•์ œํ•ด์•ผํ•  ํ•„์š”์„ฑ์ด ์žˆ๋Š” ๊ทœ์น™์ด ๋ฌด์—‡์ธ์ง€ ์ฒดํฌํ•ด๋ณด๋Š”๊ฒŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์„์— ๋Œ€ํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ ๊ธฐ๋ณธ ์˜ต์…˜ ๋น„ํ™œ์„ฑํ™”

์œ„ ์˜ˆ์‹œ์—์„œ ij_java_line_comment_at_first_column ์€ ๋ผ์ธ ๋‹จ์œ„ ์ฃผ์„์— ๋Œ€ํ•ด ๋“ค์—ฌ์“ฐ๊ธฐ ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์„ ํƒ๋˜์–ด์žˆ๋Š” ์ฒซ๋ฒˆ์งธ ์—ด์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋„๋ก ํ•˜๋Š” ์˜ต์…˜ ์„ค์ •์ด๋‹ค. ์ฒดํฌ์Šคํƒ€์ผ์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ ๊ทœ์น™์ด ์žˆ์–ด๋„ ์ธํ…”๋ฆฌ์ œ์ด ๊ธฐ๋ณธ๊ฐ’์ด ์ฒซ๋ฒˆ์งธ ์—ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ์— ๋“ค์—ฌ์“ฐ๊ธฐ ๊ทœ์น™์— ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์œ„์™€ ๊ฐ™์ด ๋ช…์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค๋ฉด ์ธํ…”๋ฆฌ์ œ์ด IDE ์ž๋ฐ” ์ฝ”๋“œ ์Šคํƒ€์ผ ์„ค์ • ์ค‘ Code Generation โ†’ Comment Code โ†’ Line comment at first column ์ด ์„ ํƒ๋˜์–ด์žˆ์–ด๋„ ๋ผ์ธ ์ค‘ ์ฝ”๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ณณ๋ถ€ํ„ฐ ์ฃผ์„์ด ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Line comment at first column ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฑด ๊ฝค๋‚˜ ๋งŽ์€ ์กฐ์ง์—์„œ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•œ ์ฃผ์„์ธ์ง€์— ๋Œ€ํ•œ ์œ ๋ฌด๋Š” ๋ฆฌ๋ทฐ ๋‹จ๊ณ„์—์„œ ๊ฒ€์ถœํ•˜๋Š”๊ฒŒ ์ข‹๊ฒ ์ฃ ?

Checkstyle ๋ฐ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ์Šคํƒ€์ผ ์„ค์ • ๊ณต์œ ํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด์— Checkstyle์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์žˆ๋”๋ผ๋„ ์ธํ…”๋ฆฌ์ œ์ด์—์„œ Checkstyle ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์‚ฌ์šฉ๋˜๋„๋ก ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ฝ”๋“œ ์Šคํƒ€์ผ์— ์ฒดํฌ์Šคํƒ€์ผ ์„ค์ •์„ ์Šคํ‚ค๋งˆ๋กœ ์ž„ํฌํŠธํ•˜๋Š” ๊ณผ์ •์€ ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์ด๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ž๋ฐ” ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋ฉด .idea ์™€ ๊ฐ™์€ ์ธํ…”๋ฆฌ์ œ์ด์—์„œ ์ฐธ์กฐํ•˜๋Š” ํด๋”๋ฅผ .gitignore๋กœ ์ถ”์ ๋˜์ง€ ์•Š๋„๋ก ํ•ด๋‘์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์ฒดํฌ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์•„๋ž˜์˜ 3๊ฐ€์ง€ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๊ด€๋ฆฌ๋˜๋„๋ก ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฏธ ๋ฌด์‹œ๋˜๋Š” ๊ทœ์น™์— ๋Œ€ํ•ด์„œ๋„ .gitignore ๊ทœ์น™์—์„œ ์ œ์™ธ๋˜๋Š” ํŒจํ„ด์„ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

.gitignore
### IntelliJ IDEA ### .idea !.idea/codeStyles/codeStyleConfig.xml !.idea/codeStyles/Project.xml !.idea/checkstyle-idea.xml

์ด๋ฏธ .idea ํด๋”๊ฐ€ ์ œ์™ธ๋˜์–ด์žˆ๋‹ค๋ฉด ์ˆ˜๋™์œผ๋กœ 3๊ฐœ์˜ ํŒŒ์ผ์„ ์˜ค๋ฅธ์ชฝ ๋งˆ์šฐ์Šค๋ฅผ ๋ˆŒ๋Ÿฌ Git โ†’ Add ๊ธฐ๋Šฅ์œผ๋กœ ์ถ”์ ์ด๋˜๋„๋ก ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์‹ ๊ทœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ• ๋•Œ ํ”„๋กœ์ ํŠธ ๋‹จ์œ„์˜ ์„ค์ •์„ ๊ณต์œ ํ•˜๋Š” ๊ฑธ ๊ณ ๋ คํ•˜์‹œ๋Š”๊ฒŒ ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค.

๋์œผ๋กœ, ์ด๋ ‡๊ฒŒ ํ•˜๋”๋ผ๋„ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ ๋ฌธ์„œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์ •๋ง๋กœ ์„ค์ •์ด ๋™์ผํ•œ์ง€ ์ฒดํฌํ•ด์ฃผ๋Š” ๊ณผ์ •์€ ํ•„์š”ํ•˜๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„๋„ ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” IDE ์„ค์ •์ด ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ๋งž์ถฐ์ง€์ง„ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹ํ•˜๋Š” ์—…๋ฌด ๋ฐฉ์‹์€ ์ง€์–‘ํ•˜๊ณ  ์ž‘์—… ๋ธŒ๋žœ์น˜์™€ PR์„ ํ†ตํ•ด ๊ฐ•์ œ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

์ธํ…”๋ฆฌ์ œ์ด์™€ ์ดํด๋ฆฝ์Šค๋ฅผ ํ˜ผ์šฉํ•˜๋Š” ์กฐ์ง์ด๋ผ๋ฉด GGโ€ฆ ๐Ÿ˜…


Checkstyle๋กœ ์ผ๊ด€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ

์•ž์„œ ๋‹ค๋ฃฌ๊ฒƒ ์ฒ˜๋Ÿผ Checkstyle์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ผ๊ด€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ๊ฒƒ์ด๋ƒ์— ๋”ฐ๋ผ ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๊ด€์ ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ธํ…”๋ฆฌ์ œ์ด ๊ธฐ๋ณธ ํฌ๋งทํ„ฐ์™€ ์ฒดํฌ์Šคํƒ€์ผ ๊ทœ์น™์— ๋”ฐ๋ผ ์ผ๊ด€๋˜๊ฒŒ ํฌ๋งทํŒ…๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ ์Šคํƒ€์ผ ์ค‘์—์„œ ๋งˆ์ง€๋ง‰ D ์Šคํƒ€์ผ์€ Method declaration parameters ์™€ ๊ฐ™์€ ๊ทœ์น™์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์•„๋ž˜์™€ ๊ฐ™์ด EditorConfig ๊ทœ์น™์œผ๋กœ ๊ฐ•์ œํ•˜์—ฌ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

// A ์Šคํƒ€์ผ
@GetMapping("/")
public String index(HttpServletRequest request, HttpServletResponse response, HttpHeaders headers, Principal principal) {
    return "ok";
}

// B ์Šคํƒ€์ผ
@GetMapping("/")
public String index(HttpServletRequest request, HttpServletResponse response, 
                    HttpHeaders headers, Principal principal) {
    return "ok";
}

// C ์Šคํƒ€์ผ
@GetMapping("/")
public String index(HttpServletRequest request,
                    HttpServletResponse response,
                    HttpHeaders headers,
                    Principal principal) {
    return "ok";
}

// D ์Šคํƒ€์ผ
@GetMapping("/")
public String index(
    HttpServletRequest request,
    HttpServletResponse response,
    HttpHeaders headers,
    Principal principal
) {
    return "ok";
}
.editorconfig
[*.java] ij_java_call_parameters_new_line_after_left_paren = true ij_java_call_parameters_right_paren_on_new_line = true ij_java_method_parameters_new_line_after_left_paren = true ij_java_method_parameters_right_paren_on_new_line = true

๊ฐœ์ธ์ ์œผ๋กœ๋Š” A ์Šคํƒ€์ผ๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก B ์Šคํƒ€์ผ ๊ทธ๋ฆฌ๊ณ  C ์Šคํƒ€์ผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ  D ์Šคํƒ€์ผ์€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋ฐ ์ž๋™์œผ๋กœ ๊ฒ€์ถœํ•  ์ˆ˜๊ฐ€ ์—†๋Š” ์ผ€์ด์Šค๋ผ PR ๋ฆฌ๋ทฐ ๋‹จ๊ณ„์—์„œ ์ฒดํฌ๊ฐ€ ํ•„์š”ํ•ด๋ณด์ธ๋‹ค.