๐Ÿ๏ธ Spring

๋ณตํ•ฉ ํ‚ค(Composite Key) ์—ฌ๋Ÿฌ ์—ด์„ ์กฐํ•ฉํ•˜์—ฌ ๊ธฐ๋ณธ ํ‚ค(Primary Key)์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ํ‚ค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹๋ณ„ ๊ด€๊ณ„ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋‚ด๋ ค๋ฐ›์•„์„œ ์ž์‹ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค + ์™ธ๋ž˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๋น„์‹๋ณ„ ๊ด€๊ณ„ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ž์‹ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๋น„์‹๋ณ„ ๊ด€๊ณ„๋Š” ํ•„์ˆ˜์  ๋น„์‹๋ณ„ ๊ด€๊ณ„์™€ ์„ ํƒ์  ๋น„์‹๋ณ„ ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜์  ๋น„์‹๋ณ„ ๊ด€๊ณ„(Mandatory) ์™ธ๋ž˜ ํ‚ค์— NULL์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋ฐ˜๋“œ์‹œ ๋งบ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์  ๋น„์‹๋ณ„ ๊ด€๊ณ„(Optional) ์™ธ๋ž˜ ํ‚ค์— NULL์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์„์ง€ ๋ง์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹๋ณ„ ๊ด€๊ณ„์™€ ๋น„์‹๋ณ„ ๊ด€๊ณ„์˜ ์„ ํƒ ์ตœ๊ทผ์—๋Š” ๋น„์‹๋ณ„ ๊ด€๊ณ„๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ..
๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์กฐํšŒํ•˜๊ธฐ ๋“ฑ๋ก๋œ ์Šคํ”„๋ง ๋นˆ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ApplicationContext๋ฅผ ์ฃผ์ž…๋ฐ›์€ ๋’ค, beanDefinitionNames()๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด CommandLineRunner๋ฅผ ํ†ตํ•ด ๋นˆ์ด ๋ชจ๋‘ ๋“ฑ๋ก๋œ ํ›„ ๋นˆ์„ ์ถœ๋ ฅํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. @Component class BeanPrinter( ac: ApplicationContext ) : CommandLineRunner { private final val ac: ApplicationContext = ac override fun run(vararg args: String?) { val beanDefinitionNames = ac.beanDefinitionNames for (beanDefini..
์ €๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ผ๋ฐ˜์ ์œผ๋กœ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ @Id์™€ @GenerateValue, ๊ทธ๋ฆฌ๊ณ  Long ํƒ€์ž…์˜ id๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ id๋Š” ์ง์ ‘ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜๊ธฐ์— save()์‹œ id์˜ ๊ฐ’์€ ํ•ญ์ƒ null์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ฝ”ํ‹€๋ฆฐ์„ ๊ณต๋ถ€ํ•˜๊ณ , ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ JPA๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๋˜ ์ค‘, ์ฝ”ํ‹€๋ฆฐ์—์„œ id์— null์„ ํ—ˆ์šฉํ•˜๊ฒŒ๋” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋”๋Ÿฌ์›Œ์งˆ ๊ฒƒ ๊ฐ™์•„์„œ, null์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ–ˆ๋Š”๋ฐ ๊ฒฐ๋ก ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค์˜€์Šต๋‹ˆ๋‹ค. ํ˜น์€ nullable ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. save()๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ? ์ €์žฅํ•˜๋ ค๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ์ธ ๊ฒฝ์šฐ persist๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ merge๋ฅผ ์ง„..
๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ฆฌ๋ฉด JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. @Controller public class MemberController { @GetMapping("/") public MemberDto getInfo(){ return new MemberDto("์‹ ๋™ํ›ˆ",12)); } } ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Controller๋ฅผ @RestController๋กœ ๋ฐ”๊พธ์–ด์ฃผ๊ฑฐ๋‚˜, @ResponseBody๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ResponseEntity๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ResponseEntity๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. @Controller public class MemberContr..
@WebMvcTest๋ฅผ ํ†ตํ•ด Controller์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ Spring Security๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค๋ฉด Security๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ Filter๋“ค์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฑฑ์ •์ด ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ๋„์ค‘ Error creating bean~~๋“ฑ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‚˜์š”? ๐Ÿง ์•„๋ž˜๋Š” ์ œ๊ฐ€ ๋ฐœ์ƒ์‹œ์ผฐ๋˜ ์˜ค๋ฅ˜์ด๋ฉฐ, ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด๋‚˜ Directory์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋Š” ~~ ๋กœ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name '~~..
@RequestBody๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด MappingJackson2HttpMessageConverter๊ฐ€ ObjectMapper๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•ด์ค๋‹ˆ๋‹ค. ์ฆ‰ @RequestBody์˜ ๋ฐ”์ธ๋”ฉ ์กฐ๊ฑด์€ ObjectMapper์˜ ๋ฐ”์ธ๋”ฉ ์กฐ๊ฑด๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ณผ์ •์€ ๋งจ ๋งˆ์ง€๋ง‰์— ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ๊ธฐ๋ณธ์ ์ธ ์ƒํ™ฉ์—์„œ ๋ฐ”์ธ๋”ฉ์ด ๋˜๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด (๋ชจ๋“  ์ ‘๊ทผ์ œ์–ด์ž) ๊ธฐ๋ณธ์ƒ์„ฑ์ž + (public) Getter ๊ฐ€๋Šฅ (๋ชจ๋“  ์ ‘๊ทผ์ œ์–ด์ž) ๊ธฐ๋ณธ์ƒ์„ฑ์ž + (๋ชจ๋“  ์ ‘๊ทผ์ œ์–ด์ž) Setter ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ (๋ชจ๋“  ์ ‘๊ทผ์ œ์–ด์ž) ๊ธฐ๋ณธ์ƒ์„ฑ์ž + (public์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ ‘๊ทผ์ œ์–ด์ž) Getter ObjectMapper ์กฐ๊ฑด ๋ณ€๊ฒฝํ•˜๊ธฐ object..
์ƒํ™ฉ 1 - String ํƒ€์ž…์˜ List์ธ ๊ฒฝ์šฐ "๋ฆฌ์ŠคํŠธ๋ช…" : [ "์š”์†Œ1", "์š”์†Œ2", "์š”์†Œ3", "์š”์†Œ4" ] ์š”์†Œ์˜ " "๋Š” ์ƒ๋žต๊ฐ€๋Šฅ ์˜ˆ์‹œ public class Blog { private String address; private List visitor = new ArrayList(); public List getVisitor() { return visitor; } public String getAddress() { return address; } public Blog() { } } ํ…Œ์ŠคํŠธ์ฝ”๋“œ @SpringBootTest class ObjectMapperTest { private ObjectMapper objectMapper = new ObjectMapper(); private static ..
๋ชจ๋“  ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ dialect(๋ฐฉ์–ธ)์ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์ œ application.properties ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด dialect๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์—ˆ๊ณ  spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect ์ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ ์ณ์ฃผ๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect ์ฐธ๊ณ  - MySQL ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ข…๋ฅ˜์™€ ํŠน์ง• https://nomadlee.com/mysql-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%97%94%EC%..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (8 Page)