๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ

    [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ „๋ ฅ๋ง์„ ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ (level2, python)

    [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ „๋ ฅ๋ง์„ ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ (level2, python)

    ๐Ÿค” ํ’€์ด ์ฝ”๋“œ import copy from collections import deque def bfs(start, tree, n): visited = [False for _ in range(n+1)] queue = deque() queue.append(start) visited[start] = True result = 1 while queue: now = queue.popleft() for next_node in tree[now]: if not visited[next_node]: queue.append(next_node) visited[next_node] = True result += 1 return result def solution(n, wires): answer = n adjust_arr = [[..

    [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋’ค์— ์žˆ๋Š” ํฐ ์ˆ˜ ์ฐพ๊ธฐ (level2, python)

    [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋’ค์— ์žˆ๋Š” ํฐ ์ˆ˜ ์ฐพ๊ธฐ (level2, python)

    ๐Ÿค” ํ’€์ด ์ฝ”๋“œ from collections import deque def solution(numbers): answer = [-1 for i in range(len(numbers))] stack = deque() for idx, now in enumerate(numbers): if not stack: stack.append([idx, now]) continue top_idx, top_now = stack[-1] while stack and now > top_now: stack.pop() answer[top_idx] = now if stack: top_idx, top_now = stack[-1] stack.append([idx, now]) return answer ๐Ÿค” ๋ฌธ์ œ ํ’€์ด ์šฐ์„ , ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋ณด๋ฉด..

    [Spring] API ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Swagger ๋„์ž…ํ•˜๊ธฐ (gradle ๊ธฐ์ค€)

    [Spring] API ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Swagger ๋„์ž…ํ•˜๊ธฐ (gradle ๊ธฐ์ค€)

    ๋ณธ ๊ธ€์€, ํ•„์ž๊ฐ€ Swagger๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ณ„์†๋˜์–ด ์‚ฌ์šฉ๋ฒ•์ด ์—…๋ฐ์ดํŠธ ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. - 2023.03.24 : Tag / Operation / ApiResponses / ApiResponse / Parameter - 2023.03.25 : @ControllerAdvice์—์„œ์˜ ์‚ฌ์šฉ, @Schema, @Schema์˜ hidden ์˜ต์…˜๊ณผ ๋ฌธ์ œ ํ•ด๊ฒฐ ๐Ÿ 0. ์„œ๋ก  ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ REST API๋ฅผ ์ž˜ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์€ ํ‰์ƒ์˜ ์ˆ™์›์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ž˜ ๋งŒ๋“  API์— ๋Œ€ํ•ด ์ž˜ ์ •๋ฆฌํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž์™€, ์ธ์ˆ˜์ธ๊ณ„๋ฅผ ๋ฐ›๊ฑฐ๋‚˜, ์‚ฌ๋‚ด API๋ฅผ ํ˜ธ์ถœํ•  EndPoint์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•ดํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ต‰์žฅํžˆ ์œ ํšจํ•œ ์ž์›์œผ๋กœ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ•™์ƒ ๋•Œ๋Š”, API ๋ฌธ์„œ๋ฅผ ๋”ฐ๋กœ ์™ธ๋ถ€ ๋ฌธ์„œ๋กœ ์ž‘..

    [TS] JPA error - Specified key was too long; max key length is 1000 bytes

    [TS] JPA error - Specified key was too long; max key length is 1000 bytes

    ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ๋„์ค‘, ํ•œ ์‚ฌ๋žŒ๋‹น ํ•˜๋‚˜์˜ ๊ณ„์ •๊ณผ ๋ฉค๋ฒ„ ์†Œ์†์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ, unique ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ unique ํ‚ค๋กœ ์ง€์ •ํ•œ ๊ฒƒ์€, ์ด๋ฆ„๊ณผ tel1, tel2, tel3์™€ ๊ฐ™์€ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ unique ํ‚ค๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ž ํ•˜๋‹จ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Specified key was too long; max key length is 1000 bytes ์šฐ์„ , ๋‹น์‹œ Java์—์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฆ„๊ณผ tel1, tel2, tel3์— ๋Œ€ํ•ด์„œ String ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์–ด๋– ํ•œ ์ œํ•œ์„ ๋‘์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. JPA์—์„œ spring.jpa.hibernate.ddl-auto=create ์˜ต์…˜์œผ๋กœ ์ž๋™์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ MyISAM ์—”์ง„์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ..

    [Spring] @Transactional๊ณผ DB Lock์— DeepDive - (1) DB ํŠธ๋žœ์žญ์…˜, ์‚ฌ์šฉ๋ฐฉ๋ฒ•, ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ์ „ํŒŒ ๋‹จ๊ณ„ ํ›‘์–ด๋ณด๊ธฐ

    [Spring] @Transactional๊ณผ DB Lock์— DeepDive - (1) DB ํŠธ๋žœ์žญ์…˜, ์‚ฌ์šฉ๋ฐฉ๋ฒ•, ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ์ „ํŒŒ ๋‹จ๊ณ„ ํ›‘์–ด๋ณด๊ธฐ

    ๐Ÿค” 0. DB ํŠธ๋žœ์žญ์…˜ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ์ตœ์†Œ ๋‹จ์œ„์˜ ์ž‘์—…์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ, commit()์„ ํ†ตํ•ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๋“ ์ง€ ์•„๋‹ˆ๋ฉด rollback()์„ ํ†ตํ•ด ๋ชจ๋‘ ์ทจ์†Œ๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—… ๋‹จ์œ„. ํŠธ๋žœ์žญ์…˜์€ DB์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„์— ์†ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ INSERT, UPDATE, DELETE ๋“ฑ์˜ SQL๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด, ์ž๋™์œผ๋กœ ํ•œ ๋ผ์ธ๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์–ด Commit์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜์˜ ์˜์—ญ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด, ํ•œ ํŠธ๋žœ์žญ์…˜ ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ช…๋ น๋ฌธ์„ ๋„ฃ๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. START TRANSACTION; .... COMMIT; ํŠธ๋žœ์žญ์…˜์€ ์šฐ๋ฆฌ๋ง๋กœ '๊ฑฐ๋ž˜'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A์™€ B๊ฐ€ ๊ฑฐ๋ž˜๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ A๊ฐ€ B์—๊ฒŒ ๋ˆ์„ ์ž…๊ธˆ ํ–ˆ์œผ๋‚˜, B์—๊ฒŒ ์‚ฌ์ •์ด ์ƒ๊ฒจ ๋ฌผ๊ฑด์„ ๋ณด๋‚ด์ง€..

    [Spring] @ControllerAdvice์™€ @ExceptionHandler

    ๐Ÿค” 0. ๊ธฐ์กด์˜ Exception์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ๋ฐฉ๋ฒ• Java Application์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ, ๋งŽ์€ Exception์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Exception์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋Œ€๋ถ€๋ถ„ ์•„์‹œ๋‹ค์‹œํ”ผ try-catch ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. try ๊ตฌ๋ฌธ ๋‚ด๋ถ€์—์„œ Exception์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฌธ์žฅ์„ ์‹คํ–‰ํ•˜๊ณ , ํ•ด๋‹น try๋ฌธ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ Exception์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ catch ๋ฌธ์„ ๋ถ™์—ฌ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , Exception์„ ํ•ธ๋“ค๋งํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, SpringBoot์—์„œ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋ช‡ ๊ฐ€์ง€ ๋ถˆํŽธํ•œ ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†๊ณ , ํ•ญ์ƒ try-catch ๋ธ”๋ก์œผ๋กœ ๋ฌถ์–ด์„œ ๊ฐœ๋ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํŒŒ์•…ํ•˜๋ ค๋ฉด, ์ด๋Ÿฌ..

    [TS] ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ Spring WebFlux ์ ์šฉ ๊ณผ์ • ์ค‘ ์ƒ๊ธด ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

    [TS] ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ Spring WebFlux ์ ์šฉ ๊ณผ์ • ์ค‘ ์ƒ๊ธด ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

    ๐Ÿ›  1. Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider ์˜ค๋ฅ˜ > ์ฐธ๊ณ  ๊ธ€ OSX - M1 ๊ฐœ๋ฐœํ™˜๊ฒฝ ์˜ค๋ฅ˜ - could not load a native library: netty_resolver_dns_native_macos_aarch_64 ์ง€๋‚œ๋ฒˆ ํฌ์ŠคํŒ…๊ณผ ๋น„์Šทํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. OSX - M1 ๊ฐœ๋ฐœํ™˜๊ฒฝ ์˜ค๋ฅ˜ - [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Mac and os.arch=aarch6. #g ์–ผ๋งˆ ์ „ ์ง€๊ธ‰๋ฐ›์€ M1๋งฅ๋ถ์—์„œ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๋ฉด์„œ ๊ฒช์€ junho85.pe.kr ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ž ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค...

    [Effective Java] ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

    ๋ณธ ๊ธ€์€ ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” 3ํŒ์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋‚ด์šฉ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ0. ์„œ๋ก  ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€, public ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š”, ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ(static factory method)๋ฅผ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ˆœํžˆ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ ์—ญํ• ์˜ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์˜ˆ์‹œ๋กœ, Boolean ๋ž˜ํผ ํด๋ž˜์Šค์˜ valueOf ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } ๊ทธ๋ ‡๋‹ค๋ฉด ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๐Ÿค” 1. ์ •์  ํŒฉํ† ..