๐ŸŽฎ ํ”„๋กœ๊ทธ๋ž˜๋ฐ/2025 ํ•œ๊ฒฝxํ† ์Šค ๋ถ€์บ (Fullstack)

[ํ•œ๊ฒฝxToss] 15์ฃผ์ฐจ ์š”์•ฝ : Java SpringBoot + ์ฒซ ์Šคํ”„๋ง ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ

xxilliant 2025. 4. 12. 23:19
728x90
๋ฐ˜์‘ํ˜•

 

๊ฐœ์ธ์˜ ํ•™์Šต ๋‚ด์šฉ ๊ธฐ๋ก ์ค‘, ๊ทนํžˆ ์ผ๋ถ€์˜ ๋‚ด์šฉ๋งŒ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ž๋ฐ” ์Šคํ”„๋ง๋ถ€ํŠธ ๊ธฐ์ดˆ

 

๐ŸŒฑ Spring ๊ฐœ๋…

  • Java ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
  • ๋ชฉํ‘œ: ํ˜„๋Œ€ ์ž๋ฐ” ๊ธฐ๋ฐ˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ์„ค์ • ๋ชจ๋ธ ์ œ๊ณต

โœจ Spring์˜ ์ฃผ์š” ํŠน์ง•

- POJO ์ง€ํ–ฅ

  • POJO (Plain Old Java Object): ์™ธ๋ถ€ ๊ธฐ์ˆ  ์—†์ด ์ˆœ์ˆ˜ Java๋กœ ์ž‘์„ฑ๋œ ๊ฐ์ฒด

- ๊ฒฝ๋Ÿ‰ ์ปจํ…Œ์ด๋„ˆ

  • ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰

- IoC (์ œ์–ด์˜ ์—ญ์ „) / DI (์˜์กด์„ฑ ์ฃผ์ž…)

  • ๊ฐ์ฒด ๊ฐ„ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜์—ฌ ์œ ์—ฐํ•œ ๊ตฌ์กฐ ์„ค๊ณ„ ๊ฐ€๋Šฅ

- AOP (๊ด€์ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

  • ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ(๋กœ๊น…, ๋ณด์•ˆ ๋“ฑ)์„ ํ•ต์‹ฌ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌ

๐Ÿš€ Spring Boot ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜

๐Ÿ”น @SpringBootApplication

  • 3๊ฐ€์ง€ ์–ด๋…ธํ…Œ์ด์…˜์˜ ์กฐํ•ฉ:
    1. @ComponentScan: Bean ๋“ฑ๋ก
    2. @EnableAutoConfiguration: ์ž๋™ ์„ค์ •
    3. @SpringBootConfiguration: ์„ค์ • ํด๋ž˜์Šค

โ˜• Bean (๋นˆ)

  • Spring์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
  • ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋จ (์ด๋ฆ„ ์ค‘๋ณต ๋ถˆ๊ฐ€)
  • ์ด๋ฆ„ ๊ทœ์น™: ์ฒซ ๊ธ€์ž ์†Œ๋ฌธ์ž

Bean ๋“ฑ๋ก ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ•์‚ฌ์šฉ์„ค๋ช…
@Configuration + @Bean ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜๋™ ๋“ฑ๋ก
@Component + @Autowired ์ง์ ‘ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค ์ž๋™ ๋“ฑ๋ก

๐Ÿ”ง Autowired ์ฃผ์ž… ๋ฐฉ์‹

(์ž๋ฐ” ๋นˆ ์ƒ์„ฑ)

  1. ํ•„๋“œ ์ฃผ์ž…
    • ํ•„๋“œ์— @Autowired ๋ถ™์—ฌ ์ฃผ์ž…
    • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ๋‚˜ ์œ ์ง€๋ณด์ˆ˜์—์„œ ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  2. ์ƒ์„ฑ์ž ์ฃผ์ž… (๊ถŒ์žฅ)
    • ์ƒ์„ฑ์ž์— @Autowired๋ฅผ ๋ถ™์—ฌ ์ฃผ์ž…
    • final๋กœ ์„ ์–ธ ๊ฐ€๋Šฅ → ๋ถˆ๋ณ€์„ฑ ์œ ์ง€
    • ํ…Œ์ŠคํŠธ์— ์œ ๋ฆฌํ•˜๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋†’์Œ
  3. ์„ธํ„ฐ ์ฃผ์ž…
    • ์„ธํ„ฐ ๋ฉ”์„œ๋“œ์— @Autowired ๋ถ™์—ฌ ์ฃผ์ž…
    • ์„ ํƒ์  ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅ

@RestController

  • @Controller + @ResponseBody๋ฅผ ํ•ฉ์นœ ๊ฒƒ
  • ์ฃผ๋กœ JSON ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜์— ์‚ฌ์šฉ๋จ

โœ… Lombok

  • ๋ฐ˜๋ณต ์ฝ”๋“œ ์ค„์—ฌ์ฃผ๋Š” Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜:
    • @Getter, @Setter: ํ•„๋“œ ์ ‘๊ทผ ๋ฉ”์„œ๋“œ ์ž๋™ ์ƒ์„ฑ
    • @ToString, @EqualsAndHashCode: ๊ฐ์ฒด ์ •๋ณด ๋ฉ”์„œ๋“œ ์ž๋™ ์ƒ์„ฑ
    • @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor: ์ƒ์„ฑ์ž ์ž๋™ ์ƒ์„ฑ
    • @Data: ์œ„ ์—ฌ๋Ÿฌ ์–ด๋…ธํ…Œ์ด์…˜ ํฌํ•จ
    • @Builder: ๋นŒ๋” ํŒจํ„ด ์ œ๊ณต

โœ… Thymeleaf

  • HTML ๊ธฐ๋ฐ˜ ํ…œํ”Œ๋ฆฟ ์—”์ง„ (Spring Boot์™€ ์ž˜ ์—ฐ๋™)
  • ํŠน์ง•:
    • ๋ธŒ๋ผ์šฐ์ € ์นœํ™”์ 
    • ์ง๊ด€์  ๋ฌธ๋ฒ•
    • ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์‰ฝ๊ฒŒ ์ฃผ์ž…
    • devtools๋กœ ์ž๋™ ๋ฆฌ๋ Œ๋”๋ง ์ง€์›

Java์—์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹

  • request, session: HTTP ๊ด€๋ จ ๊ฐ์ฒด
  • GET/POST ํŒŒ๋ผ๋ฏธํ„ฐ: ํด๋ผ์ด์–ธํŠธ ์ „๋‹ฌ ๋ฐ์ดํ„ฐ
  • Model: ๋ทฐ์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  • ModelAndView: ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌ

๋‚ด์žฅ ๊ฐ์ฒด ์ƒ๋ช… ์ฃผ๊ธฐ

  • application: ์•ฑ ์ „์ฒด ์ƒ๋ช… ์ฃผ๊ธฐ
  • session: ์‚ฌ์šฉ์ž ๋‹จ์œ„
  • request: ํ•œ ๋ฒˆ์˜ ์š”์ฒญ-์‘๋‹ต ์‚ฌ์ด
  • model: request์™€ ๋™์ผ

@Value ์šฉ๋„

  • Spring์˜ @Value: ์„ค์ •๊ฐ’ ์ฃผ์ž… (@Value("${key}"))
  • Lombok์˜ @Value: ๋ถˆ๋ณ€ ๊ฐ์ฒด ์ƒ์„ฑ์šฉ (final, getter ์ž๋™ ์ƒ์„ฑ ๋“ฑ)

์—ญํ•  ์ •๋ฆฌ

  • DTO: ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์šฉ ๊ฐ์ฒด(Data Transfer Object)
  • DAO: DB ์ ‘๊ทผ ๊ฐ์ฒด
  • Entity: DB ํ…Œ์ด๋ธ” ๋งคํ•‘ ํด๋ž˜์Šค
  • VO: ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ ๋‹ด๋Š” ๊ฐ์ฒด
  • Controller: HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ
  • Service: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ
  • Repository: DB ์ฒ˜๋ฆฌ ๋กœ์ง ๋‹ด๋‹น

โœ… H2DB (Java๋ฅผ ์œ„ํ•ด ํƒœ์–ด๋‚œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)

๋กœ์ปฌ ํ™˜๊ฒฝ, ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ์—์„œ DB ์„ ํƒ์‹œ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ตœ๊ณ ์˜ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

H2 = ์ž๋ฐ”๋กœ ์ž‘์„ฑ๋œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ


Entity : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ํด๋ž˜์Šค

  • @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด JPA๊ฐ€ ์ด ํด๋ž˜์Šค๋ฅผ ํ…Œ์ด๋ธ”๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•จ
  • ํด๋ž˜์Šค์˜ ํ•„๋“œ = ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด ๋จ.
  • DB์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฐ์ฒด๋กœ, ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ/์กฐํšŒ์šฉ์œผ๋กœ ์‚ฌ์šฉ
  • @Id, @GeneratedValue, @Column ๋“ฑ ๋‹ค์–‘ํ•œ JPA ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ปฌ๋Ÿผ ์†์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
@Entity
public class User { // User ํด๋ž˜์Šค: user ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘๋จ
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String email;
    // id, name, email์€ ๊ฐ๊ฐ ์ปฌ๋Ÿผ์œผ๋กœ ์‚ฌ์šฉ
}

๐Ÿงช @SpringBootTest

: ์Šคํ”„๋ง ๋ถ€ํŠธ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋”ฉํ•ด์„œ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜.

 

๐Ÿ”ง ์ฃผ์š” ํŠน์ง•

  • ์‹ค์ œ ์Šคํ”„๋ง ๋ถ€ํŠธ ์•ฑ์ฒ˜๋Ÿผ ๋นˆ(Bean)๋“ค์ด ๋ชจ๋‘ ๋“ฑ๋ก๋œ ์ƒํƒœ์—์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์— ์ ํ•ฉ (Controller, Service, Repository ๋ชจ๋‘ ์—ฎ์ธ ํ…Œ์ŠคํŠธ)

 

@SpringBootTest
class UserServiceTest {

    @Autowired
    UserService userService;

    @Test
    void testCreateUser() {
        // ํ…Œ์ŠคํŠธํ•  ๋กœ์ง ์ž‘์„ฑ
    }
}

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์˜ˆ์‹œ


โœ… JpaRepository ๊ธฐ๋ณธ ํ•จ์ˆ˜

  1. findAll() : ์ „์ฒด ์กฐํšŒ (SELECT *)
  2. save() :
    • id ์—†์œผ๋ฉด INSERT
    • id ์žˆ์œผ๋ฉด UPDATE
  3. delete() : ์‚ญ์ œ (DELETE)

์‚ฌ์šฉ์ž ์ •์˜ ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ

  • findByํ•„๋“œ๋ช…() ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ
    → ์˜ˆ:
    • findById(2L) → SELECT * FROM member WHERE id = 2
    • findByUserId("hong") → SELECT * FROM member WHERE user_id = 'hong'

JPA์—์„œ SQL ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. JPQL
    • ANSI SQL ์ง€์›, DBMS ๋…๋ฆฝ์ 
    • FROM์ ˆ์—๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ช… ์‚ฌ์šฉ (์†Œ๋ฌธ์ž โŒ)
  2. Native SQL
    • DBMS์— ์ข…์†์  ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์˜ˆ: LIMIT, now(), sysdate)
    • UPDATE, INSERT, DELETE ์‹œ
      @Modifying, @Transactional ํ•„์š”

 

์ž๋ฐ”์Šคํ”„๋ง์œผ๋กœ ์ฒ˜์Œ API๋ฅผ ๊ฐœ๋ฐœํ•ด๋ดค๋Š”๋ฐ, ์€๊ทผํžˆ ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค (์ด๊ฒŒ..๊ทธ ์ทจ์—…์ž˜๋œ๋‹ค๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ๊ตฌ๋‚˜!)

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ ์จ๋ณด์•˜๋‹ค!

์•„์ง ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž˜ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๊ณ„์† ์—ฐ์Šตํ•ด๋ณด๋ฉด ๊ฐ์ด ์žกํž ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐฑ์—”๋“œ๋ฅผ ๋ฐฐ์šฐ๋ฉด์„œ ๋А๋‚€๊ฑฐ์ง€๋งŒ, ๋‚ด๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์ข‹์•„ํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๊ฐ€

๊ฒฐ๊ณผ๋ฌผ์ด ์ง๊ด€์ ์œผ๋กœ ๋ฐ”๋กœ ๋ˆˆ์— ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค (์‹ค์‹œ๊ฐ„ ๋ฆฌ๋กœ๋”ฉ ๊ฐ€๋Šฅ + ์ง๊ด€์„ฑ)

 

API๋Š” ๋ญ”๊ฐ€.. ์„ฑ๊ณตํ•˜๋ฉด ๋ฟŒ๋“ฏํ•˜๊ธด ํ•œ๋ฐ ๋‹ต๋‹ตํ•˜๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹

FE๋Š” ๋‚ด ๊ฐ•์ ์ธ ๋ฏธ๊ฐ์„ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๊ณ ,

๋ˆˆ์œผ๋กœ ๋ฐ”๋กœ ํ™•์ธํ•˜๋Š”๊ฑธ ์ข‹์•„ํ•ด์„œ(์• ๋งคํ•œ ๊ฑธ ์‹ซ์–ดํ•จ) ๋‚œ UI๊ฐ€ ์ข‹์•„ ^-^

 

์—ฐ์Šต ์ฝ”๋“œ : https://github.com/inthhh/javaSpring_code

 

 

728x90
๋ฐ˜์‘ํ˜•