๐Ÿค– Backend/SpringBoot

์ตœ๊ทผ ํšŒ์‚ฌ ์—…๋ฌด ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋กœ์šฐ๋ ˆ๋ฐธ ๊ธฐ์ˆ (์ด๋ผํ•˜์ง€๋งŒ ํ”ํžˆ๋“ค ๋ ˆ๊ฑฐ์‹œ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ธฐ์ˆ )๋“ค์„ ๊ณต๋ถ€ํ•˜๊ณ  ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์ตœ์‹  ๊ธฐ์ˆ  ๋ฐ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ, ๋ฒ„์ €๋‹ ๊ด€๋ฆฌ ์‹คํŒจ๋กœ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์˜€๋‹ค. ์›์ธ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” ๊ณผ์ •์—์„œ SSLHanndshakeException์œผ๋กœ ์ธํ•ด DB Connection ํš๋“์„ ์‹คํŒจํ•ด conn์ด null์ธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.The last packet successfully received from the server was 65 milliseconds ago. The last packet sent successfully to the server was 61 milliseconds ago. at java.base/jdk.internal.reflect.NativeConstructo..
์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ์–ด์„œ, ์˜ค๋žœ๋งŒ์— ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”๋ฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์Šคํ”„๋ง ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด ์‹คํ–‰์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๊ณ  ํ…Œ์ŠคํŠธ๋Š” ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ ๋กœ๊ทธ์—๋Š” ์—„์ฒญ๋‚œ ์–‘์˜ ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ๋‚จ๊ณ  Build ๊ฒฐ๊ณผ์—๋„ ์—๋Ÿฌ๊ฐ€ ๊ฐ€๋“ํ–ˆ๋‹ค. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ํ˜„์ƒ ๋ถ„์„ ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๊ธธ์ง€๋งŒ ๊ฒฐ๊ตญ ์•„๋ž˜ ๋กœ๊ทธ๊ฐ€ ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ์—ˆ๋‹ค. java.lang.instrument.IllegalClassFormatException: Error while instrumenting sun/security/ec/SunEC$1 with JaCoCo 0.8.8.202204050719/5dcf34a. at org.jacoco.agent.rt.internal_b6258fc.CoverageTransformer.transfo..
@DataJpaTest๋ฅผ ์ด์šฉํ•œ Repository ํ…Œ์ŠคํŠธ ์ค‘ ๋ณธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋˜ DDL์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. H2 ↔๏ธ MySQL ๋ฌธ๋ฒ• ์ฐจ์ด๋กœ ์ธํ•ด ํ…Œ์ด๋ธ”์ด ์ œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์„œ application-test.properties ๋ฅผ ๊ณ„์† ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค. ๋ฌธ๋“, ์ง€๋‚œ ๋ฒˆ์—๋„ @DataJpaTest ํ…Œ์ŠคํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ @AutoConfigureTestDatabase์œผ๋กœ ํ•ด๊ฒฐํ•œ ๊ธฐ์–ต์ด๋‚˜์„œ ์‹œ๋„ํ•˜์˜€๊ณ  ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค. ๊ทธ๋•Œ๋„ ๋””๋ฒ„๊น… ๊ณผ์ • ๊ธฐ๋ก์„ ๋ฏธ๋ค„๋‘๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด ์ฐธ์— ๋ธ”๋กœ๊น…ํ•˜๊ณ  ์žฅ๊ธฐ ๊ธฐ์–ต์œผ๋กœ ๊ฐ€๋ณด์ž. ๋ฌธ์ œ ๋ถ„์„ ์‹œ๋„ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ธํ„ฐ๋„ท์—๋„ ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ์ผ€์ด์Šค๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • ๋ฌธ์ œ์ด๊ฑฐ๋‚˜ DDL ํ˜น์€ SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋‹ค. ๊ณตํ†ต์ ..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ Transaction ์ด๋ž€? (2020.12.22)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜, Transaction ์ด๋ž€? Transaction์ด๋ž€, DB์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ ๋œปํ•œ๋‹ค. DB์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์€ ์•„๋ž˜์˜ SQL์„ ์ด์šฉํ•ด์„œ DB์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. SELECT INSERT DELETE UPDATE ์ฐฉ๊ฐํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ์€ ์ž‘์—…์˜ ๋‹จ์œ„๋Š” SQL ํ•œ ๋ฌธ์žฅ์ด ์•„๋‹ˆ๋‹ค. ๋งŽ์€ SQL ๋ช…๋ น๋ฌธ๋“ค์„ ์‚ฌ๋žŒ์ด ์ •ํ•˜๋Š” ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ž‘์—…์˜ ๋‹จ์œ„๋‹ค. ๊ณ„์‹œํŒ์„ ์˜ˆ๋ฅผ๋“ค์–ด ๋ณด๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ , ์—…๋กœ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค. ๊ทธ ํ›„์— ๋‹ค์‹œ ๊ฒŒํŒ์— ๋Œ์•„์™”์„ ๋•Œ, ๊ฒŒ์‹œํŒ์€ ์ž์‹ ์˜ ๊ธ€์„ ํฌํ•จํ•œ ์—…๋ฐ์ดํŠธ๋œ ๊ฒŒ์‹œํŒ์„ ๋ณด๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ DB ์ž‘์—…..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ ๋นŒ๋“œ ๊ด€๋ฆฌ ๋„๊ตฌ Maven๊ณผ Gradle ๋น„๊ตํ•˜๊ธฐ (2021.01.06)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋นŒ๋“œ ๊ด€๋ฆฌ ๋„๊ตฌ๋ž€? ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ, ํ…Œ์ŠคํŠธ ๋นŒ๋“œ, ๋ฐฐํฌ ๋“ฑ์˜ ์ž‘์—…์„ ์œ„ํ•œ ์ „์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์„ฑํ•œ java ์ฝ”๋“œ์™€ ํ”„๋กœ์ ํŠธ ๋‚ด์— ํ•„์š”ํ•œ ๊ฐ์ข… xml, properties, jar ํŒŒ์ผ๋“ค์„ JVM์ด๋‚˜ WAS๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒจํ‚ค์ง•ํ•ด์ฃผ๋Š” ๋นŒ๋“œ ๊ณผ์ • = ๋นŒ๋“œ ์ž๋™ํ™” ๋„๊ตฌ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ์ข…๋ฅ˜์™€ ๋ฒ„์ „๋“ค, ์ข…์†์„ฑ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ Maven Maven์€ Java์šฉ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๋„๊ตฌ๋กœ Apache์˜ Ant ๋Œ€์•ˆ์œผ๋กœ ๋งŒ๋“ค์–ด ์กŒ๋‹ค. ๋นŒ๋“œ ์ค‘์ธ ํ”„๋กœ์ ํŠธ, ๋นŒ๋“œ ์ˆœ์„œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ ๊ด€๊ณ„๋ฅผ pom.xml ์— ๋ช…์‹œํ•œ๋‹ค. ์™ธ๋ถ€์ €์žฅ์†Œ์—..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ java.sql.SQLException: Incorrect string value (2021.03.28)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. java.sql.SQLException: Incorrect string value: '\xEC\xB0\xBD\xEC\xB0\xBD...' for column `mm_server`.`restaurant`.`name` at row 1 Query is: insert into restaurant (deliveryable, description, location, name, price, type) values (?, ?, ?, ?, ?, ?), parameters [0,,3,'์ฐฝ์ฐฝ๊ตญ๋ฐฅ',0,0] java thread: http-nio-8080-exec-1 at..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ ์Šคํ”„๋ง์˜ application.properties ์„ค์ • (+ ddl ์„ค์ •, DB url/port) (2021.07.26)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. application.properties spring.jpa.hibernate.ddl-auto=update spring.jpa.generate-ddl=false spring.datasource.url=jdbc:mariadb//{PATH}/{DATABASE} spring.datasource.username={USERNAME} spring.datasource.driver-class-name=org.mariadb.jdbc.Driver jpa ddl ์„ค์ • ddl-auto update : ๊ธฐ์กด์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ JPA์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ถ”..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ ์†Œ๋‚˜ํ๋ธŒ์™€ Jacoco๋กœ ์ฝ”๋“œ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ (2023.09.07)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. โš™๏ธ Setup EC2 ์„œ๋ฒ„์— SonarQube ์„ค์น˜ ๋ฐ ์„ค์ • 1. ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ์œ„ํ•œ Swap ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์„ค์น˜ touch ~/swapfile sudo fallocate -l 2G ~/swapfile sudo chmod 600 ~/swapfile sudo mkswap ~/swapfile sudo swapon ~/swapfile sudo yum install java-17-amazon-corretto-headless ์•„๋ž˜ ํŒŒ์ผ๋“ค์„ ์—ด์–ด์„œ ๊ฐ€์žฅ ์•„๋ž˜์— ์ถ”๊ฐ€ /etc/fstab ~/swapfile swap swap defaults 0 0 /etc/sysctl.conf vm.max..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ Transaction ์ด๋ž€? (2023.08.11)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋Š˜ Swagger์˜ ์ž๋™ํ™”์™€ ๊ฐ„๋‹จํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋น ๋ฅธ API ๋ฌธ์„œ ๋ฐฐํฌ๋งŒ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์ž‘์—…๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์€ ์žˆ์—ˆ์ง€๋งŒ, ๋ชจ๋“  ์š”์ฒญ์„ Postman์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๊ณ  Swagger์˜ ์ž๋™ ์ƒ์„ฑ ๋ฌธ์„œ๊ฐ€ ์นœ์ ˆํ•œ ํŽธ์€ ์•„๋‹ˆ๊ธฐ์— ์ฝ๋Š” ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ดํ•ด๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋ก ํŠธ์—์„œ API๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ €์—๊ฒŒ ์ง์ ‘ ๋ฌผ์–ด๋ณด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•œ ์˜์˜๊ฐ€ ์‚ฌ๋ผ์ ธ๋ฒ„๋ฆฌ๋Š” ์ผ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค… ๐Ÿ˜” ์ด๋ฒˆ ๋ฆฌ๋ทฐ๋ฉ”์ดํŠธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ œํ•œ๋œ ์‹œ๊ฐ„ ๋‚ด์— FE์™€ AI ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•  ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ Swagger์—์„œ MultipartFile๊ณผ DTO ํ•œ ๋ฒˆ์— ๋ฐ›๋Š” @RequestPart ์š”์ฒญ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ธฐ (2023.08.29)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์š”์ฒญ์„ ์š”์ฒญํ•  ํ•„์š” ์—†์ด ํ•˜๋‚˜์˜ ์š”์ฒญ์—์„œ ํŒŒ์ผ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํž˜๋“ค๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋”๋‹ˆ, ํ”„๋ก ํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ณ  Swagger์—์„œ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค. ๋ณธ ํฌ์ŠคํŒ…์€ ๋…ธ๋ ฅ์ด ํ—›๋˜์ง€ ์•Š๋„๋ก ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ณ ์ณ๋‚˜๊ฐ„ ๊ธฐ๋ก๋“ค์ด๋‹ค. 1. Request body์˜ Content-type์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Œ ๋ฌธ์ œ ์ƒํ™ฉ MultipartFile์™€ DTO๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์„ ๋งŒ๋“ค๋•Œ, ๋‹ค๋ฅธ ์—ฌํƒ€ ์š”์ฒญ๋“ค์ฒ˜๋Ÿผ @PostMapping์— URL๋งŒ ์„ค์ •ํ•˜๋ฉด Swagger์˜ Request b..
sckwon770
'๐Ÿค– Backend/SpringBoot' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก