๊ฐœ๋ฐœ/BACKEND

๐Ÿค” Impl ? ๋ณ€๋™์‚ฌํ•ญ์— ์‰ฝ๊ฒŒ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค/๊ตฌํ˜„์ฒด ๋ฐฉ์‹์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌํ˜„์ฒด ์ด๋ฆ„์ด๋‹ค.Service๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ํ•ด๋‹น Service์˜ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋ฅผ `ServiceImpl`๋ผ๋Š” ๋ช…์นญ์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.์‹ค์ œ๋กœ ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ, ๋‚˜๋Š” ํ”„๋กœ์ ํŠธ ๋Œ€๋ถ€๋ถ„์˜ Service๋ฅผ ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๐ŸŽฏ Impl๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ์ด์œ ์Šคํ”„๋ง์„ ์ฒ˜์Œ ๋ฐฐ์šธ๋•Œ๋ถ€ํ„ฐ Service๋‹จ์˜ ๋ฏธ๋ž˜์— ๋ฐœ์ƒํ•  ํ™•์žฅ์„ ์œ„ํ•ด ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๋ฐฐ์› ๊ณ , ์‹ค์ œ๋กœ DB๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ ๊ธฐํš์—์„œ ํ™•์žฅ์— ๊ด€ํ•˜์—ฌ ์ •ํ•ด์ง„ ๊ฒƒ์ด ์—†์—ˆ์ง€๋งŒ, ๋ฏธ๋ž˜์— ์žˆ์„ ํ™•์žฅ์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค/๊ตฌํ˜„์ฒด ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.  ๐Ÿ˜จ Impl..
โœ๏ธ Entity์˜ ๊ธฐ๋ก ๋‚จ๊ธฐ๊ธฐํ˜„์—…์—์„œ๋Š” ์šด์˜์ƒ์— ๋ฐœ์ƒํ•  ์ด์Šˆ๋“ค์„ ์ถ”์ ํ• ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Entity๋งˆ๋‹ค `์ƒ์„ฑ์‹œ๊ฐ„`,`๋ณ€๊ฒฝ์‹œ๊ฐ„`๋“ฑ์„ ๋‚จ๊ธด๋‹ค๊ณ  ํ•œ๋‹ค.์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” User Entity์— ์ƒ์„ฑ์‹œ๊ฐ„์ธ `createdAt`, ๋ณ€๊ฒฝ์‹œ๊ฐ„์ธ `modifiedAt`์ด ์กด์žฌํ•œ๋‹ค.Entity ๊ธฐ๋ก ๋‚จ๊ธฐ๊ธฐ@Entity@Getterpublic class UserDetail{ @Column(name = "created_at") private LocalDateTime createdAt; @Column(name = "modified_at") private LocalDateTime modifiedAt; ...}๐Ÿ”„ ์‹œ๊ฐ„ ์ƒ์„ฑ ๋ฐ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•1. ์ง์ ‘ ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ ( ๋น„์ถ”์ฒœ ๐Ÿ™…‍โ™‚๏ธ )// 1. ..
@Entity@Table(name = "users")public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "email", length = 100) private String email; ...} ์Šคํ”„๋ง์„ ์ฒ˜์Œ ๊ณต๋ถ€ํ•œ ์ดํ›„๋กœ ์–ด๋–ค ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋˜ ๊ฐ„์— PK์€ ํ•ญ์ƒ Auto Increament๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.๊ทธ๋Ÿฌ๋˜ ์ค‘, ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ›์•˜๋‹ค."User ํ…Œ์ด๋ธ”์€ Auto Increament๋ณด๋‹ค๋Š” Email์„ PK๋กœ ํ•˜๋Š”๊ฒŒ ๋” ์ข‹์•„๋ณด์—ฌ์š”."์ด์œ ๊ฐ€ ๊ถ๊ธˆํ–ˆ์ง€๋งŒ, ๊ทธ์ „์— "์™œ ๋‚˜๋Š” Auto In..
๐Ÿ“ข  ์š”์•ฝ์—ฌ๋Ÿฌ๋ถ„์ด ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด์…”์•ผํ•ฉ๋‹ˆ๋‹ค. 1๏ธโƒฃ Gradle ์„ค์ •ํ™•์ธ  Gradle ์„ค์ • ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์…”์•ผํ•ฉ๋‹ˆ๋‹ค. 2๏ธโƒฃ Q ํด๋ž˜์Šค ์ƒ์„ฑ ํ™•์ธQํด๋ž˜์Šค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒ์„ฑ์ด ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์…”์•ผํ•ฉ๋‹ˆ๋‹ค.(build/generated/sources/annotationProcessor/java/main ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑ๋˜์–ด์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.) 3๏ธโƒฃ query๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜์˜€๋Š”์ง€  ํ™•์ธํ•ด์ฃผ์„ธ์š”. ๐Ÿ“– ์˜ค๋ฅ˜ ํšŒ๊ณ  1๏ธโƒฃ Gradle ์„ค์ •ํ™•์ธ  configurations { compileOnly { extendsFrom annotationProcessor }} dependencies { implementation 'com.qu..
โ—๏ธ ์—๋Ÿฌ ๋ฐœ์ƒ mysql ์„ธํŒ…์„ ํ•˜๋Š”๋ฐ ๊ณ„์† ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.cannot resolve class or package 'cj' dependencies๋„ ์ œ๋Œ€๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ ์™œ ์•ˆ๋ ๊นŒ??? ๊ณ„์† ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.   dependencies { runtimeOnly 'com.mysql:mysql-connector-java'}  ๐Ÿš€ ํ•ด๊ฒฐ๋ฒ• ๊ทธ๋Ÿฌ๋‹ค ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.   ๋ฐ”๋กœ ๋„ค์ด๋ฐ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค..... ํ•˜..... ์ด๋Ÿฌ๋‹ˆ ์•ˆ๋˜์ง• dependencies { runtimeOnly 'com.mysql:mysql-connector-java'}  โ“ ์›์ธ ํƒ์ƒ‰ ์ €๋Š”  ์Šคํ”„๋ง ๋ถ€ํŠธ 3.2.5๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.  ํ•ด๋‹น ์—๋Ÿฌ๋Š” 3.1.0 ๋ฒ„์ „ ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ 3.1.0 ๋ฏธ๋งŒ ๋ฒ„์ „์—์„œ๋Š”  mysql-connec..
html์„ ํŒŒ์‹ฑํ•ด์„œ ์ธ๋„ค์ผ ์ด๋ฏธ์ง€๋ฅผ ์ถ”์ถœํ•ด Amazon S3์— ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ์ผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ธ ๋งŒํผ ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉด S3 ๋น„์šฉ๋„ ์•„๋ผ๊ณ  ํ”„๋ก ํŠธ ๋ Œ๋”๋ง ์†๋„ ์—ญ์‹œ ๊ฐœ์„ ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ  resize์™€ webp ์ด๋ฏธ์ง€ ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด๋ฏธ์ง€ ์ฝ๊ธฐURL ์ •๋ณด๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฝ์–ด์™€์•ผ ํ–ˆ์—ˆ๋Š”๋ฐ Java์—์„œ javax.imageio.ImageIO ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.URL ํ˜น์€ ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.BufferedImage image = ImageIO.read(new URL(์ด๋ฏธ์ง€ ์ฃผ์†Œ));BufferedImage image = ImageIO.read(new File(์ด๋ฏธ์ง€ ์ €์žฅ ์œ„์น˜));java.awt.image...
์ด๋ฒˆ์— JPA๋ฅผ ํ†ตํ•ด์„œ ์™ธ๋ถ€ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ Read/Write๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ Spring Batch์˜ ๋ฉ”ํƒ€ ํ…Œ์ด๋ธ”์€ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.Spring batch 5.0์—์„œ @EnableBatchProcessing์˜ ์ƒˆ๋กœ์šด ์†์„ฑ์ด ์ƒ๊ฒจ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. https://spring.io/blog/2022/09/22/spring-batch-5-0-0-m6-and-4-3-7-are-out#new-configuration-class-for-infrastructure-beansSpring Batch๊ฐ€ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” dataSource ๋ฐ transactionManager๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โ›”๏ธ ์ฃผ์˜์ SpringBoot 3.0๋ถ€ํ„ฐ @EnableBatchProcessing ํ˜น์€ DefaultBa..
์‚ฌ์šฉ์ž์˜ ๋ฉ”์ผํ•จ์—์„œ ๋‰ด์Šค๋ ˆํ„ฐ๊ฐ€ ์ „์†กํ•œ ๋ฉ”์ผ์„ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ JpaItemWriter๋ฅผ ํ†ตํ•ด์„œ Insert ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹คํ•˜์ง€๋งŒ ๋ฐฐ์น˜๋ฅผ ๋Œ๋ ค๋ณด๋‹ˆ "Class 'class java.util.ArrayList' is not an entity class" ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Stack trace๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ JpaItemWriter์—์„œ write๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š”๋ฐ ๋ฐ›์•„์˜จ ๊ฐ์ฒด๊ฐ€ Entity๊ฐ€ ์•„๋‹ˆ๋ผ List.class๋ผ์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.doWrite๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ SessionImpl ํด๋ž˜์Šค์—์„œ persist๋ฅผ ํ•˜๊ธฐ์ „์— ์ฒดํฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์ด ํ˜ธ์ถœ๋  ๋•Œ ArrayList๋Š” Entity๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.SessionImpl ํด๋ž˜์Šค์˜ contains ๋ฉ”์„œ๋“œ์ฆ‰ write ๋ฉ”์„œ๋“œ์— T๊ฐ€ Artic..
Attraction๐Ÿš€
'๊ฐœ๋ฐœ/BACKEND' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก