์ต๊ทผ ํ์ฌ ์
๋ฌด ๊ณต๋ถ๋ฅผ ์ํด์๋ ๋ก์ฐ๋ ๋ฐธ ๊ธฐ์ (์ด๋ผํ์ง๋ง ํํ๋ค ๋ ๊ฑฐ์๋ผ๊ณ ๋ถ๋ฅด๋ ๊ธฐ์ )๋ค์ ๊ณต๋ถํ๊ณ ์ฌ์ด๋ ํ๋ก์ ํธ๋ ์ต์ ๊ธฐ์ ๋ฐ ๋ฒ์ ์ ์ฌ์ฉํ๋ค ๋ณด๋, ๋ฒ์ ๋ ๊ด๋ฆฌ ์คํจ๋ก ๋ฐ์ํ ์ค๋ฅ์๋ค. ์์ธ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ณผ์ ์์ 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..
๐ค Backend/SpringBoot
์๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ๋ค์ด ์์ด์, ์ค๋๋ง์ ํตํฉ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์คํํ๋๋ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์คํ๋ง ์ดํ๋ฆฌ์ผ์ด์
์์ฒด ์คํ์๋ ๋ฌธ์ ๊ฐ ์๊ณ ํ
์คํธ๋ ์ ์์ ์ผ๋ก ์คํ๋์ง๋ง, ํ
์คํธ ๋ก๊ทธ์๋ ์์ฒญ๋ ์์ ์๋ฌ ๋ก๊ทธ๊ฐ ๋จ๊ณ 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..