์ „์ฒด ๊ธ€

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[SpringBoot] dto์˜ ์œ„์น˜

DTO์˜ ์œ„์น˜๋Š” ํŒจํ‚ค์ง€ ์„ค๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š”๊ฐ€์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„๋‹ค ์–ด๋–ค ๊ฒฝ์šฐ๋Š” repository ๊ณ„์ธต์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , service ๊ณ„์ธต์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์—์„œ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉด ๋ณ„๋„์˜ dto ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด๋‘ . ํŠน์ • ์„œ๋น„์Šค ๊ณ„์ธต๊นŒ์ง€๋งŒ ์‚ฌ์šฉ๋˜๋ฉด, ํ•ด๋‹น ์„œ๋น„์Šค ๊ณ„์ธต์— dtoํด๋ž˜์Šค๋ฅผ ํ•จ๊ป˜ ๋‘”๋‹ค. ํŠน์„ฑ repository ๊นŒ์ง€ ํ•ด๋‹น dto๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ํ•ด๋‹น repository ๊ณ„์ธต์— dtoํด๋ž˜์Šค๋ฅผ ํ•จ๊ป˜ ๋‘  ๊ถ๊ทน์ ์œผ๋กœ๋Š” ํŒจํ‚ค์ง€ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ณ ๋ฏผํ•˜๋ฉด์„œ ๊ฐ€๊ธ‰์  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€ ์—ฐ๊ด€์„ ์ค„์ด๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ด ์ข‹์€ ๋ฐฉ์‹์ด๋‹ค ์ฐธ์กฐ : https://www.inflearn.com/questions/24222/dto-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[SpringBoot] 2.7.13 ์—์„œ swagger ์˜ค๋ฅ˜

SpringBoot 2.7.13์—์„œ swagger๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด dependencies๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค ์‹คํ–‰ํ•˜์˜€์œผ๋‚˜ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค ใ… ใ…  org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException ์ฐพ์•„๋ณด๋‹ˆ application.properties ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค spring.mvc.pathmatch.matching-strategy=ant_path_matcher 2.6 ๋ฒ„์ „ ์ดํ›„์— spring.mvc.pathmatch.matching-str..

๐Ÿ’พORM:JPA

๋ณ€๊ฒฝ ๊ฐ์ง€์™€ ๋ณ‘ํ•ฉ

์ค€์˜์† ์—”ํ‹ฐํ‹ฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋”๋Š” ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์—”ํ‹ฐํ‹ฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–˜ ์ˆ˜ ์—†๋‹ค ๊ธฐ์กด ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž„์˜๋กœ ๋งŒ๋“ค์–ด๋‚ธ ์—”ํ‹ฐํ‹ฐ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋งŒ๋“œ๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• em.detach(entity) : ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋งŒ ์ค€์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜ em.clear() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” em.close() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…๋ฃŒ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ธฐ๋Šฅ (์„ ํ˜ธ) em.find๋กœ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ • ๋ณ‘ํ•ฉ(merge) ์‚ฌ์šฉ em.merge๋ฅผ ์‹คํ–‰ ์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์„ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์œผ๋กœ ๋ชจ๋‘ ๊ต์ฒดํ•จ (๋ณ‘ํ•ฉ์‹œ ๊ฐ’์ด ์—†์œผ๋ฉด null๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์œ„ํ—˜๋„ ์žˆ์Œ) ์ƒˆ๋กœ์šด ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ ( ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์—”ํ‹ฐํ‹ฐ๋Š” ..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[SpringBoot] SpringBoot ์ •๋ฆฌ

์ƒ์„ฑ์ž injection์„ ์“ฐ๋Š”๊ฒŒ ์ข‹๋‹ค ์ƒ์„ฑ์ž injection์„ ํ•˜๋ฉด setter๋กœ entity๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”๊ฒฝ์šฐ @Autowired๋ฅผ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค MemberRepository๋Š” ๋ณ€๊ฒฝ๋  ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— final๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค test case๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ injection์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค ( ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ) @RequiredArgsConstructor final์ด ์žˆ๋Š” ํ•„๋“œ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค ๊ฒฐ๊ตญ ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  injection์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ @PersistenceContext -> @Autowired @PersistenceContext ๋ฅผ @Autowired๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ (SpringBo..

๐Ÿ’พORM:JPA

@Transactional

@Transactional JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ์ƒ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ @Transactional(readOnly=true) ์กฐํšŒํ•˜๋Š” ๊ณณ(์ฝ๊ธฐ ๋™์ž‘)์— ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Œ ์“ฐ๊ธฐ์—์„œ๋Š” X ํด๋ž˜์Šค ์ตœ์ƒ๋‹จ์— @Transactional(readOnly=true) ๋ฅผ ์ ์–ด์ฃผ๊ณ , ์“ฐ๊ธฐํ•˜๋Š” ๊ณณ์—๋Š” @Transactional์„ ์ ์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ํ–ˆ์Œ

๐Ÿ’พORM:JPA

@JoinColumn

๋‹ค๋Œ€์ผ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ @JoinColumn(name) ์ปฌ๋Ÿผ ์ด๋ฆ„ ๋งคํ•‘์— ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์—ฐ๊ด€๊ด€๊ณ„์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†๋‹ค ์กฐ์ธ ๋Œ€์ƒ ์ปฌ๋Ÿผ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด @JoinColumn(referencedColumnName)์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค! ๋”ฐ๋ผ์„œ ๋ฌด์กฐ๊ฑด @JoinColumn์„ ์ƒ๋žตํ•ด์„  ์•ˆ๋œ๋‹ค ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ @JoinColumn @JoinColumn ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ผญ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•จ ์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ @JoinColumn ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ผ(1)์—๊ฒŒ ์ฃผ๋ ค ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค(N)์ชฝ์— @JoinColumn(insertable=false, updateable=false)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ๊ฐ•์ œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ  : https://hyeon9..

๐Ÿ’พORM:JPA

JPA ์ฟผ๋ฆฌ ( JPQL )

JPA๋Š” ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค JPQL (๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ JPQL๋กœ ํ•ด๊ฒฐ) QueryDSL ๋„ค์ดํ‹ฐ๋ธŒ SQL JDBC API ์ง์ ‘ ์‚ฌ์šฉ, MyBatis, SpringJdbcTemplate ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ JPQL์ด๋ž€? : ๊ฐ์ฒด์ง€ํ–ฅ SQL JPA๋Š” SQL์„ ์ถ”์ƒํ™”ํ•œ JPQL์ด๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด(ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰)๋ฅผ ์ œ๊ณต SQL๊ณผ ๋ฌธ๋ฒ• ์œ ์‚ฌ, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN ์ง€์› SQL์„ ์ถ”์ƒํ™”ํ•ด์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL์— ์˜์กดX JPQL์€ ๊ฒฐ๊ตญ SQL๋กœ ๋ณ€ํ™˜๋œ๋‹ค ํ”„๋กœ์ ์…˜(SELECT) SELECT m FROM Member m : ์—”ํ‹ฐํ‹ฐ ํ”„๋กœ์ ์…˜ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ „๋ถ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๊ฐ€ ๋œ๋‹ค ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด up..

๐Ÿ’พORM:JPA

๊ฐ’ ํƒ€์ž…, ๊ฐ’ ํƒ€์ž… ์ปฌ๋ž™์…˜

๊ฐ’ ํƒ€์ž… ์ˆ˜์ • ๊ฐ’ ํƒ€์ž…์€ immutable ํ•ด์•ผ ํ•จ ๊ฐ’ ํƒ€์ž…์˜ setter๋กœ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ๋จ update๋ฌธ์ด ๋‚˜๊ฐ€์ง€๋งŒ side effect๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Œ Member findMember = em.find(Member.class,member.getId()); // ๊ฐ’ํƒ€์ž… Address์˜ homeCity ๋ฅผ newCity๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์Œ findMember.getHomeAddress().setCity("newCity"); // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ๋จ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒˆ๋กœ์šด Address๋กœ ๊ฐˆ์•„๋ผ์›Œ์•ผ ํ•œ๋‹ค // ๊ฐ’ํƒ€์ž… Address์˜ homeCity ๋ฅผ newCity๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์Œ Address a = findMember.getHomeAddress(); findMember.setHomeAddress(new Addres..

mc.thd
mincheolsong