๐ŸŒทDev

Pageable์„ ์‚ฌ์šฉํ•˜๋Š” JPA ๋ฉ”์„œ๋“œ์—์„œ N+1๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ์— ์‹œ๋„ํ•ด ๋ณธ ๊ฒƒ๋“ค๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‹ค. ๋ฌธ์ œ ์ƒํ™ฉ ๊ฒŒ์‹œํŒ ์ „์ฒด ๋ชฉ๋ก๋ณด๊ธฐ์‹œ ํ˜ธ์ถœ๋˜๋Š” Pageable์„ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค. public interface BaordRepository extends JpaRepository { Page findAllByHideIsFalse(Pageable pageable); } findAllByHideIsFalse() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด N+1๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ฒŒ์‹œํŒ์„ ์ž‘์„ฑํ•œ user์˜ ์ˆ˜ N๋งŒํผ ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. Hibernate: select board0_.id as id1_0_, board0_.content as content2_0_, board0_.create..
Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€? ์ปจํŠธ๋กค๋Ÿฌ์—์„œ text/htmlํ˜•์‹์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ XML ๋˜๋Š” JSON ํ˜•ํƒœ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. Jackson์€ ๊ทธ ์ค‘ JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด Jackson์€ Java์—์„œ JSON์„ ํŒŒ์‹ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ ์„ธํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. JSON์„ ํŒŒ์‹ฑํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์—๋Š” Jackson ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Google์ด ๋งŒ๋“  GSON ๋˜๋Š” SimpleJSON ๋„ ์žˆ๋‹ค. Spring์ด Jackson์„ ๋” ์„ ํ˜ธํ•˜๋Š” ์ด์œ  Jackson, GSON, SimpleJSON์˜ ์ฐจ์ด๋Š” ์—†๋‹ค. Jackson์˜ ํŠน๋ณ„ํ•œ ์ ์€ Spring 3.0๋ถ€ํ„ฐ Jackson๊ณผ ๊ด€๋ จ๋œ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ..
'spring-boot-starter-web' ์˜์กด์„ฑ์„ ํฌํ•จ์‹œํ‚ค๋ฉด, Spring Boot๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋Š” ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐ ์ž๋™ ๊ตฌ์„ฑ์˜ ์ผ๋ถ€๋กœ Spring Boot์˜ ๋ฒ„์ „์— ๋”ฐ๋ผ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŠน์ • ๋ฒ„์ „์ด ๊ฒฐ์ •๋œ๋‹ค. 2.7.15 ๋ฒ„์ „์˜ Spring Boot ํ”„๋กœ์ ํŠธ์—์„œ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์˜์กด์„ฑ๊ณผ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ./gradlew dependencies 'com.fasterxml.jackson.core' ๋˜๋Š” 'jackson-databind'์™€ ๊ฐ™์€ Jackson ๊ด€๋ จ ์˜์กด์„ฑ์„ ์ฐพ์œผ๋ฉด ํ•ด๋‹น ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Spring ..
ํ”„๋กœ์ ํŠธ์—์„œ ๋Ÿฐํƒ€์ž„ ์‹œ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , OCP๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ฝ”๋“œ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋””์ž์ธ ํŒจํ„ด์„ ๊ณ ๋ คํ•œ ๊ณผ์ •์„ ๊ธฐ๋กํ•˜์˜€๋‹ค. 1. ์ „๋žต ํŒจํ„ด vs ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ์ƒ์†์€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฐ€์ ‘๋˜์–ด ์žˆ์–ด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๋‹ค. ๋˜ํ•œ ์ƒ์† ๊ด€๊ณ„๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์ค‘ ๊ฐ์ฒด๋ฅผ ๋™์ ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค. ๋Ÿฐํƒ€์ž„ ์‹œ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์€ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. 2. ์ „๋žต ํŒจํ„ด vs ์ƒํƒœ ํŒจํ„ด 2-1. ์ „๋žต ํŒจํ„ด ์ „๋žต ํŒจํ„ด์€ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์บก์Šํ™”ํ•˜๊ณ , ์ด ๋ฐฉ๋ฒ•๋“ค์„ ์ƒํ˜ธ ๊ต์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ ํŒจํ„ด์ด๋‹ค. Context : ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒƒ, ์ „๋žต..
ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ณ ๋ฏผํ•œ ๋‚ด์šฉ ์ •๋ฆฌ    [ ํ”„๋กœ์ ํŠธ ์„ค๋ช… ]๊ณต์œ  ํŽ˜์ด์ง€ ๋ฆฌ๋‰ด์–ผ ํ”„๋กœ์ ํŠธ์ด๊ณ , ๊ณต์œ  ํŽ˜์ด์ง€ ๋‚ด์—๋Š” ๋‹ค์–‘ํ•œ ๋ธ”๋ก๋“ค์ด ์žˆ๋‹ค. ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณต์œ  ํŽ˜์ด์ง€ ๋‚ด์˜ ๋ธ”๋ก๋“ค๊ณผ ๋ธ”๋ก ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋“ค์€ ์ €์žฅ/์ˆ˜์ •/์กฐํšŒ ์‹œ ํ•˜๋‚˜์˜ API๋กœ ์ „์†ก๋œ๋‹ค. ๊ณต์œ  ํŽ˜์ด์ง€ ์ˆ˜์ • ์‹œ ๋ธ”๋ก์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ ํ˜น์€ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ธ”๋ก์˜ ์ˆœ์„œ๋Š” int๊ฐ’์ด ์•„๋‹Œ, Request, Response ๋ฐ์ดํ„ฐ์— ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ๋ฆฌ์ŠคํŠธ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•œ๋‹ค.     1. NoSQL vs MySQLํ”„๋กœ์ ํŠธ ํ”Œ๋กœ์šฐ์ƒ Update๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ •ํ™•์„ฑ ๋ณด์žฅ์„ ์œ„ํ•ด MySQL์„ ์„ ํƒํ•˜์˜€๋‹ค.    2. Foreign key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋กœ DB ์„ค๊ณ„๊ณต์œ  ํŽ˜..
์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection)์ด๋ž€? ์˜์กด์„ฑ ์ฃผ์ž…์€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ• Spring์€ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. @Autowired ์–ด๋…ธํ…Œ์ด์…˜์€ Spring์—๊ฒŒ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ์ง€์‹œ์ž ์—ญํ• ๋กœ ์“ฐ์ธ๋‹ค. 1. ์ƒ์„ฑ์ž ์ฃผ์ž… (Constructor Injection) @Service public class SpaceWallFindService { private final SpaceWallRepository spaceWallRepository; private final BlockStrateg..
๊ณต์œ  ํŽ˜์ด์ง€ ๋ฆฌ๋‰ด์–ผ ํ”„๋กœ์ ํŠธ์—์„œ ๊ณต์œ  ํŽ˜์ด์ง€ ๋‚ด์— ์—ฌ๋Ÿฌ ๋ธ”๋ก๋“ค์ด ์žˆ๊ณ  ๊ฐ ๋ธ”๋ก๋“ค์€ ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ ๊ฐ€๋Šฅ ์œ ๋ฌด๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ์ˆ˜์ • ์ „ ์ฝ”๋“œ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์—๋Š” switch case ๋ฌธ์œผ๋กœ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. ์—ฌ๊ธฐ์„œ blockType์ด ์ถ”๊ฐ€/์‚ญ์ œ๋  ๊ฒฝ์šฐ Serice ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— OCP์— ์œ„๋ฐฐ๋˜๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์ข‹์ง€ ์•Š์€ ์ฝ”๋“œ์ด๋‹ค. ๋˜ํ•œ ์‹คํ–‰ ์ค‘ blockType์˜ ๊ต์ฒด๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜์—ฌ ์ „๋žต ํŒจํ„ด์„ ์ด์šฉํ•ด ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๐Ÿ”ฝ ์ „๋žต ํŒจํ„ด์„ ์„ ํƒํ•œ ์ด์œ  [Java] ์ „๋žต ํŒจํ„ด vs ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด vs ์ƒํƒœ ํŒจํ„ด ํ”„๋กœ์ ํŠธ์—์„œ ๋Ÿฐํƒ€์ž„ ์‹œ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , OCP๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ฝ”๋“œ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋””์ž์ธ ํŒจํ„ด์„ ๊ณ ๋ คํ•œ ๊ณผ์ •์„ ๊ธฐ๋กํ•˜์˜€๋‹ค. 1. ์ „๋žต ํŒจํ„ด vs ํ…œ..
๋ฌธ์ œ ์ƒํ™ฉ AWS EC2์™€ Nginx๋กœ ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•˜๊ณ  multipart/form-data๋ฅผ ์ „์†กํ•˜๋ฉด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. nginx: [warn] could not build optimal types_hash, you should increase either types_hash_max_size: 1024 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size ์ด ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€๋Š” Nginx๊ฐ€ types_hash๋ฅผ ์ตœ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. types_hash๋ฅผ ์ตœ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” types_hash_max_size ๋˜๋Š” types_hash_bucket_size ์ค‘ ํ•˜๋‚˜๋ฅผ ๋Š˜๋ ค์•ผ ํ•œ๋‹ค๋Š” ์กฐ์–ธ์ด๋‹ค. ๋ฌธ์ œ ์›์ธ typse_ha..
alreadykite
'๐ŸŒทDev' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก