[Java] ํ”„๋ก์‹œ ํŒจํ„ด, ์ •์  ํ”„๋ก์‹œ, ๋™์  ํ”„๋ก์‹œ: Spring ์‚ฌ๋ก€ ์ค‘์‹ฌ ์„ค๋ช…

2025. 7. 9. 23:09ยท๐Ÿ› ๏ธBackend/โ˜•Java

โœ… 1. ํ”„๋ก์‹œ(Proxy) ๋ž€?

  • ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๊ฐ์ฒด๋กœ ๋””์ž์ธ ํŒจํ„ด์˜ ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.
  • ํ”„๋ก์‹œ์˜ ์ฃผ์š” ๋ชฉ์ ์€ ์ ‘๊ทผ ์ œ์–ด, ๋กœ๊น…/๊ฐ์‹œ, ์ง€์—ฐ ๋กœ๋”ฉ, ๋ณด์•ˆ ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์ด ์žˆ๋‹ค.

โœ… 2. ํ”„๋ก์‹œํŒจํ„ด(Proxy Pattern) ์ด๋ž€?

interface Subject {
    void request();
}

class RealSubject implements Subject {
    public void request() {
        System.out.println("์‹ค์ œ ์ž‘์—… ์ˆ˜ํ–‰");
    }
}

class Proxy implements Subject {
    private RealSubject realSubject;

    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject(); // ์ง€์—ฐ ์ดˆ๊ธฐํ™”
        }
        System.out.println("ํ”„๋ก์‹œ: ์ ‘๊ทผ ์ œ์–ด ๋˜๋Š” ๋กœ๊น…");
        realSubject.request(); // ์‹ค์ œ ๊ฐ์ฒด์— ์š”์ฒญ ์ „๋‹ฌ
    }
}
  • ํ”„๋ก์‹œ ๊ฐœ๋…์„ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ์„ค๊ณ„ ํŒจํ„ด์„ ์˜๋ฏธํ•œ๋‹ค.
  • GoF(Gang of Four)์˜ ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ๊ตฌ์กฐ ํŒจํ„ด์— ์†ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋ณดํ†ต ํ”„๋ก์‹œ ํŒจํ„ด์—์„œ๋Š” ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…(๋กœ๊น…, ์ธ์ฆ, ์บ์‹ฑ ๋“ฑ)์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ •๋ฆฌํ•˜๋ฉด, ํ”„๋ก์‹œ ํŒจํ„ด์€ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํŒ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ถ€๊ฐ€ ๋กœ์ง(๋กœ๊น…, ์ธ์ฆ, ์บ์‹ฑ, ํŠธ๋žœ์žญ์…˜ ๋“ฑ)์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•œ ํ›„ ์ง„์งœ ๊ตฌํ˜„ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • Spring ์—์„  AOP ๋ฅผ ํ™œ์šฉ ํ•˜๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ AOP๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ ํ•œ ๋’ค ์‹ค์ œ ๋กœ์ง์„ ์‹คํ–‰์„ ์‹œ์ผœ์ค€๋‹ค. ์ด๋•Œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ Spring ์€ AOP ์„ค์ •์„ ๋ณด๊ณ  ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์„ ํ•ด์ค€๋‹ค. ์ฆ‰, ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ์ž‘์„ฑ์„ ํ•˜๋ฉด ๋œ๋‹ค. ์ด ์ฒ˜๋Ÿผ ํ”„๋ก์‹œ๊ฐ์ฒด๋ฅผ ๋Ÿฐํƒ€์ž„์— ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๋ฐฉ์‹์„ ๋™์  ํ”„๋ก์‹œ(Dynamic Proxy) ๋ผ๊ณ  ํ•œ๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์ •์  ํ”„๋ก์‹œ(Static Proxy) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ( ํ”„๋ก์‹œ ํŒจํ„ด ํ™œ์šฉ )

โœ… 3. ๋™์  ํ”„๋ก์‹œ(Dynamic Proxy) ๋ž€?

๊ตฌ๋ถ„  ์ •์  ํ”„๋ก์‹œ ๋™์  ํ”„๋ก์‹œ
์ƒ์„ฑ ์‹œ์  ์ปดํŒŒ์ผ ํƒ€์ž„ ๋Ÿฐํƒ€์ž„
๊ตฌํ˜„ ๋ฐฉ์‹ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ž๋™ ์ƒ์„ฑ
๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค or ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค(JDK), ํด๋ž˜์Šค(CGLIB)
์œ ์—ฐ์„ฑ ๋‚ฎ์Œ ๋†’์Œ
์‚ฌ์šฉ ์˜ˆ ํ”„๋ก์‹œ ํŒจํ„ด ์ง์ ‘ ๊ตฌํ˜„ Spring AOP, Feign, JPA ๋“ฑ
  • ๋Ÿฐํƒ€์ž„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์‰ฝ๊ฒŒ๋งํ•ด, ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์žˆ์œผ๋ฉด ๊ตฌํ˜„์ฒด ์—†์ด๋„ ๊ทธ ๋™์ž‘์„ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋ฒ•(๊ธฐ์ˆ )์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ฆ‰, ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋ก์‹œ ํŒจํ„ด์„ ๋™์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ„ด์ด ์•„๋‹Œ ๋™์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์ ์ธ ์ˆ˜๋‹จ์ž„.
  • Java ์—์„œ๋Š” java.lang.reflect.Proxy ์™€ InvocationHandler ๋ฅผ ์ด์šฉํ•ด์„œ ๋™์  ํ”„๋ก์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋จ.

(1) JDK ๋™์  ํ”„๋ก์‹œ - ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜

  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ต๋ช… ํด๋ž˜์Šค(ํ”„๋ก์‹œ ๊ฐ์ฒด)๋ฅผ ๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜์ด ๋˜๋ฉฐ, ์‹ค์ œ ๊ตฌํ˜„์ฒด ์—†์ด๋„ ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ๋ถ€๊ฐ€ ๋กœ์ง ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•จ.
  • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ๋Š” @FeignClient , Spring Data JPA ์˜ Repository, @Transactional ๋“ฑ์ด ์žˆ๋‹ค.
  • ์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ์ž„. ๋‚ด๋ถ€ ๊ตฌํ˜„
  • JDK(Java Development Kit) ์—์„œ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ,java.lang.reflect.Proxy ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๋Ÿฐํƒ€์ž„์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ฆ‰, ์ž๋ฐ” JDK ์ž์ฒด์— ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋Ÿฐํƒ€์ž„(๋™์ )์— ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด๋ผ JDK ๋™์  ํ”„๋ก์‹œ๋ผ ๋ถ€๋ฆ„ ( ์ฐธ๊ณ : ๋ฐ˜๋“œ์‹œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•จ )

 

(2) CGLIB ํ”„๋ก์‹œ - ํด๋ž˜์Šค ๊ธฐ๋ฐ˜

  • ๊ธฐ์กด ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ๋ณต์‚ฌ๋ณธ(์„œ๋ธŒํด๋ž˜์Šค)์„ ๋งŒ๋“ค์–ด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์„œ๋ธŒํด๋ž˜์Šค(์ƒ์†)๋ฅผ ์ƒ์„ฑํ•ด์„œ, ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ฐ€๋กœ์ฑ„๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์›๋ณธ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋ฉฐ, ์›๋ณธ ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋ฉด์„œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•œ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ SpringBoot ์˜ @Service, @Component ๊ฐ™์ด ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์ง์ ‘ AOP๊ฐ€ ์ ์šฉ๋  ๋•Œ ์‚ฌ์šฉํ•จ.
  • ์‰ฝ๊ฒŒ๋งํ•ด, ํ•ด๋‹น ๋นˆ์— AOP(๋ถ€๊ฐ€ ๊ธฐ๋Šฅ)๋ฅผ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•œ๋‹ค.
  • CGLIB ์€ Code Generaion Library ์˜ ์•ฝ์ž๋กœ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ก์‹œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์™ธ๋ถ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ, ์›๋ณธ ํด๋ž˜์Šค์˜ ์„œ๋ธŒํด๋ž˜์Šค(์ž์‹ ํด๋ž˜์Šค)๋ฅผ ๋งŒ๋“ค์–ด ๋ƒ„์œผ๋กœ์จ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— CGLIB ํ”„๋ก์‹œ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด๋‹ค. ์Šคํ”„๋ง์—์„œ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด JDK ํ”„๋ก์‹œ๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•˜๊ณ , ํ•„์š” ํ•  ๋•Œ๋งŒ CGLIB ์œผ๋กœ fallback ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ( ๊ฑ ์ง„์งœ ์ง์ ‘ ์งœ์ฃผ๋Š” ๋А๋‚Œ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋จ. )

โœ… 4. ๋Œ€ํ‘œ์ ์ธ ๋™์  ํ”„๋ก์‹œ(Dynamic Proxy) ์˜ˆ์‹œ

(1) Spring AOP

@Service
public class OrderService {
    @Transactional
    public void placeOrder() {
        // ํ•ต์‹ฌ ๋กœ์ง
    }
}
  • ํŠธ๋žœ์žญ์…˜, ๋กœ๊น…, ๋ณด์•ˆ, ์„ฑ๋Šฅ ์ธก์ • ๋“ฑ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„

(2) Spring Data JPA

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}
  • JpaRepository ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ •์˜ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ตฌํ˜„์ฒด๊ฐ€ ์ƒ์„ฑ์ด ๋˜๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

(3) FeignClient - Spring Cloud OpenFeign

@FeignClient(name = "user-service", url = "http://localhost:8080")
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable Long id);
}
  • HTTP API ํ˜ธ์ถœ์„ Java ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉ์„ ํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

(4) Spring Security

  • FilterChainProxy, MethodSecurityInterceptor ๋“ฑ์—์„œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ์ด๋‚˜ ์ ‘๊ทผ ์ œํ—Œ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ ๋ณด์•ˆ ํ•„ํ„ฐ ์ฒด์ธ์ด ๋™์ž‘์„ ํ•œ๋‹ค.

'๐Ÿ› ๏ธBackend > โ˜•Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] JDBC ๋™์ž‘ ์›๋ฆฌ์™€ ์ปค๋„ฅ์…˜ ํ’€ ์ดํ•ดํ•˜๊ธฐ  (2) 2025.08.06
[Java] ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ  (2) 2025.06.04
[Java] ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Stream) ๊ฐœ๋… + ์˜ˆ์ œ ์ด์ •๋ฆฌ ๐Ÿ“š  (2) 2025.06.03
[Java] ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ •๋ฆฌ: List, Set, Map ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด ์ด์ •๋ฆฌ  (0) 2025.05.30
[Java] java.nio ์‚ฌ์šฉ๋ฒ• | Path, Files, FileChannel ์˜ˆ์ œ ๋ชจ์Œ  (3) 2025.05.30
'๐Ÿ› ๏ธBackend/โ˜•Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Java] JDBC ๋™์ž‘ ์›๋ฆฌ์™€ ์ปค๋„ฅ์…˜ ํ’€ ์ดํ•ดํ•˜๊ธฐ
  • [Java] ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • [Java] ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Stream) ๊ฐœ๋… + ์˜ˆ์ œ ์ด์ •๋ฆฌ ๐Ÿ“š
  • [Java] ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ •๋ฆฌ: List, Set, Map ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด ์ด์ •๋ฆฌ
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (167)
      • ๐ŸŽ“๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต (32)
        • โš™๏ธ์ปดํ“จํ„ฐ์˜ ์ดํ•ด (11)
        • ๐Ÿ’ป์ปดํ“จํ„ฐ๊ณผํ•™ ๊ฐœ๋ก  (3)
        • ๐Ÿ”ข์ž๋ฃŒ๊ตฌ์กฐ (3)
        • ๐ŸŒ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ… (11)
        • ๐Ÿ›๏ธ์„ธ๊ณ„์˜์ •์น˜์™€๊ฒฝ์ œ (3)
        • ๐Ÿ–ฅ๏ธ์ปดํ“จํ„ฐ๊ณผํ•™๊ณผ (1)
      • ๐Ÿ› ๏ธBackend (58)
        • ๐Ÿ“š๋ฐฑ์—”๋“œ ๊ณต๋ถ€ (4)
        • โ˜•Java (23)
        • ๐ŸŒณSpring (13)
        • โš™๏ธC (2)
        • โšกPython (13)
        • JavaScript (1)
        • ๐Ÿ›ข๏ธDatabase (0)
        • Algorithm Problem Solving (2)
      • ๐ŸŒ Network (7)
        • ๐Ÿ“œHTTP (7)
      • ๐Ÿš€DevOps (1)
      • Data Structure (1)
      • โ›บ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ (65)
      • ์ •๋ณด (1)
      • ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ธ€ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • GitHub
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ž…์ถœ๋ ฅ
    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…
    ๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต
    ์Šคํ”„๋ง
    Python
    ์ž๋ฃŒ๊ตฌ์กฐ
    ๋ฐฐ์—ด
    ํด๋ผ์šฐ๋“œ
    ํŒŒ์ด์ฌ
    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…๊ฐœ๋ก 
    ์šด์˜์ฒด์ œ
    ๋ฐฉ์†ก๋Œ€
    ๋ฐฉํ†ต๋Œ€
    Spring Framework
    ์ปดํ“จํ„ฐ์˜ ์ดํ•ด
    Java
    spring
    ์œ ๋น„์ฟผํ„ฐ์Šค
    ์ž๋ฐ”
    ์ปดํŒŒ์ผ๋Ÿฌ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.1
junbin2
[Java] ํ”„๋ก์‹œ ํŒจํ„ด, ์ •์  ํ”„๋ก์‹œ, ๋™์  ํ”„๋ก์‹œ: Spring ์‚ฌ๋ก€ ์ค‘์‹ฌ ์„ค๋ช…
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”