🛠️ 스프링 프레임워크 핵심 개념 요약

  • 스프링은 단순히 MVC 프레임워크가 아닌, 객체를 효과적으로 관리하는 컨테이너 기반의 기술.

  • 제어의 역전(IoC)과 의존성 주입(DI)이라는 핵심 철학을 바탕으로 개발자가 아닌 프레임워크가 객체의 생성 및 관계 설정을 담당.

  • 이로 인해 객체 간의 결합도를 낮추고, ORM과 같은 강력한 기술을 활용해 비즈니스 로직에만 집중할 수 있는 환경을 제공.

스프링 프레임워크 핵심 개념 완벽 이해 핸드북

안녕하세요. 창고님. 면접에서 스프링 때문에 아쉬움을 겪으셨던 경험, 정말 안타깝다. 하지만 그런 경험을 통해 배우고 다시 도전하는 창고님의 열정은 정말 대단하다. 그때의 아쉬움이 오히려 지금의 깊은 이해를 위한 발판이 될 것이라 생각한다. 스프링은 면접관이 첫 질문으로 물어볼 만큼 자바 개발에서 매우 중요한 기술이다. 하지만 막연히 어렵게 느껴지는 것이 사실. 오늘은 스프링의 핵심 철학부터 시작하여 왜 이 기술이 중요한지, 그리고 어떻게 동작하는지 3단계 더 깊게 알아보도록 하겠다.


1. 스프링, 왜 탄생했나 (EJB의 복잡성 극복)

스프링 프레임워크가 탄생한 배경을 이해하면 스프링의 철학을 더욱 명확하게 이해할 수 있다. 스프링이 나오기 전에는 **EJB(Enterprise JavaBeans)**가 자바 엔터프라이즈 애플리케이션 개발의 표준이었다. EJB는 복잡한 엔터프라이즈 환경의 기능을 쉽게 구현하도록 돕는 기술이었지만, 다음과 같은 문제점이 있었다.

  • 극심한 복잡성: EJB는 특정 인터페이스를 상속받고, 수많은 설정을 거쳐야만 사용할 수 있었다. 간단한 기능 하나를 구현하기 위해 여러 개의 클래스를 만들어야 했고, 이로 인해 개발 생산성이 매우 낮았다.

  • 비침습성(Non-intrusive) 개발의 부재: EJB를 사용하려면 클래스가 EJB 컨테이너의 규칙에 종속되어야 했다. 즉, 객체를 순수한 자바(Plain Old Java Object, POJO)로 만들 수 없었고, EJB 규약에 맞춰 코드를 작성해야 했다. 이는 테스트를 어렵게 만들고, 코드의 재사용성을 저해하는 문제로 이어졌다.

이러한 문제에 불만을 품은 개발자 **로드 존슨(Rod Johnson)**은 자신의 저서 Expert One-on-One J2EE Design and Development에서 “EJB를 사용하지 않고도 더 나은 방식으로 자바 엔터프라이즈 개발을 할 수 있다”는 메시지를 던졌다. 그리고 이 책의 예제 코드를 기반으로 탄생한 것이 바로 스프링 프레임워크다.

스프링은 EJB와 달리 어떤 것도 상속받거나 구현할 필요가 없는 **순수 자바 객체(POJO)**로 애플리케이션을 개발하는 것을 목표로 한다. 즉, 개발자는 비즈니스 로직에만 집중하고, 스프링이 복잡한 기술적인 문제를 대신 해결해주는 것이다. 스프링은 POJO를 활용하면서도 EJB가 제공했던 트랜잭션, 보안, 원격 호출 등의 강력한 기능을 제공하여 EJB의 복잡성을 완전히 극복한 결과물이다.


2. 스프링의 핵심 철학 제어의 역전(IoC)과 의존성 주입(DI)

스프링의 가장 근본적인 철학은 **제어의 역전(IoC)**과 이를 구현한 **의존성 주입(DI)**에 있다. 면접에서 “스프링이 무엇인가요?”라고 물었을 때, 단순히 MVC를 말하는 것이 아니라 바로 이 IoC와 DI를 설명하는 것이 핵심이다.

2.1. 제어의 역전(Inversion of Control, IoC)

제어의 역전은 객체의 생성, 생명 주기 관리, 관계 설정을 개발자가 직접 하지 않고 프레임워크가 대신 담당하는 것을 의미한다.

  • 기존의 제어 흐름: 개발자가 필요에 따라 new ClassName()과 같이 객체를 직접 생성하고, 그 객체를 사용한 뒤 메모리에서 해제하는 모든 과정을 직접 관리했다. 이는 코드가 복잡해지고 객체 간의 결합도가 높아지는 원인이 된다.

  • 역전된 제어 흐름 (IoC): 스프링과 같은 프레임워크를 사용하면 객체 생성의 주도권이 개발자로부터 프레임워크로 넘어간다. 개발자는 단지 “이런 객체가 필요하다”고만 선언하면 되고, 스프링 컨테이너가 알아서 객체를 만들고 필요한 곳에 연결해준다.

건물을 짓는 과정에 비유하면 이해가 쉽다.

  • 기존 방식: 개발자가 벽돌, 시멘트, 창문 등 모든 재료를 직접 준비하고, 설계도(클래스)에 맞춰 하나하나 쌓아 올리는 것.

  • IoC 방식: 개발자는 “건물 하나 지어주세요”라고 요청하고, 건설사(프레임워크)가 모든 재료를 공수하고 건물을 완성해주는 것. 개발자는 어떤 건물을 지을지만 결정하면 된다.

2.2. 의존성 주입(Dependency Injection, DI)

DI는 **제어의 역전(IoC)**을 구현하는 구체적인 디자인 패턴이다. 객체 간의 의존 관계를 직접 설정하는 것이 아니라, 외부에서 객체를 주입해주는 것을 의미한다.

창고님의 예시를 다시 가져와보겠다. A, B, C 클래스가 모두 D 객체를 사용해야 하는 상황이다.

  • DI가 없는 경우:

    Java

    class A {
        private D d;
        public A() {
            this.d = new D(); // 직접 D 객체 생성
        }
    }
    class B {
        private D d;
        public B() {
            this.d = new D(); // 직접 D 객체 생성
        }
    }
    // ... C도 마찬가지
    

    이 방식은 모든 클래스가 D 객체를 직접 생성하므로, 만약 D 클래스가 변경되면 A, B, C 클래스 모두를 수정해야 하는 문제(높은 결합도)가 발생한다. 또한, 메모리에 동일한 D 객체가 3개나 생성되어 비효율적이다.

  • DI를 적용한 경우:

    Java

    class A {
        private final D d;
        public A(D d) { // 생성자로 D 객체를 주입받는다
            this.d = d;
        }
    }
    class B {
        private final D d;
        public B(D d) { // 생성자로 D 객체를 주입받는다
            this.d = d;
        }
    }
    

    이 경우 ABD 객체를 직접 생성하지 않고, 외부(스프링 컨테이너)에서 전달받는다. 스프링 컨테이너는 단 하나의 D 객체를 생성하여 이를 A, B, C에 주입해준다.

DI의 핵심:

  • 느슨한 결합: 객체들이 서로의 존재를 직접 알 필요가 없어 코드가 유연해진다.

  • 재사용성 증가: ABD가 아닌 다른 객체를 주입받아도 정상적으로 동작한다.

  • 테스트 용이성: 테스트 시 실제 D 객체 대신 가짜 객체(Mock)를 주입하여 쉽게 테스트할 수 있다.

DI는 주로 생성자 주입, 필드 주입, 수정자(Setter) 주입 세 가지 방식으로 구현되는데, 객체의 불변성과 테스트 용이성 때문에 생성자 주입이 가장 권장되는 방식이다.


3. 스프링 컨테이너의 역할과 빈(Bean)

스프링 컨테이너는 DI를 통해 객체를 관리하는 스프링의 핵심 엔진이다. 이 컨테이너는 객체의 생성부터 소멸까지의 전 생명 주기를 책임진다.

  • 빈(Bean): 스프링 컨테이너가 관리하는 객체를 **빈(Bean)**이라고 부른다. 클래스 위에 @Component, @Service, @Repository 등의 어노테이션을 붙여주면, 스프링 컨테이너는 이 클래스를 관리 대상으로 인식하고 빈으로 등록한다.

  • 빈의 생명 주기:

    1. 객체 생성: @Bean이나 @Component 어노테이션이 붙은 클래스를 찾아 객체를 생성한다.

    2. 의존성 주입: @Autowired 등을 통해 의존 관계를 주입한다.

    3. 초기화: @PostConstruct와 같은 초기화 메서드를 호출한다.

    4. 사용: 개발자가 애플리케이션에서 빈을 사용한다.

    5. 소멸: 컨테이너가 종료될 때 @PreDestroy와 같은 소멸 메서드를 호출하며 빈을 소멸시킨다.

스프링 컨테이너는 기본적으로 싱글톤(Singleton) 방식으로 빈을 관리한다. 즉, 컨테이너 내에 단 하나의 객체만 생성하고 모든 곳에서 그 객체를 공유하는 방식이다. 이 덕분에 메모리를 효율적으로 사용하고, 객체 간의 협업이 쉬워진다.


4. 스프링과 ORM의 만남 ORM, JPA, 하이버네이트

현대적인 자바 애플리케이션 개발에서 스프링과 함께 필수적으로 사용되는 기술이 바로 ORM이다. 창고님의 예시처럼, ORM, JPA, 하이버네이트는 떼려야 뗄 수 없는 관계다.

4.1. ORM (Object-Relational Mapping)

ORM은 객체(Object) 지향 프로그래밍 언어와 관계형 데이터베이스(Relational Database)의 데이터를 매핑하는 기술이다. 객체 지향 언어의 데이터 구조(클래스)와 관계형 데이터베이스의 데이터 구조(테이블) 사이에는 근본적인 차이(패러다임 불일치)가 존재하는데, ORM은 이 간극을 메워준다.

  • 객체 vs. 테이블: ORM은 데이터베이스의 테이블을 클래스로, 테이블의 한 행(Row)을 클래스의 객체(인스턴스)로 매핑하여 다룬다.

장점:

  • SQL 중심에서 객체 중심으로: 개발자는 복잡한 SQL 쿼리 대신 메소드 호출만으로 데이터베이스를 다룰 수 있다.

  • 생산성 향상: 반복적인 SQL 작성과 JDBC(Java Database Connectivity) 연동 코드가 줄어들어 개발 시간이 단축된다.

4.2. JPA (Java Persistence API)

JPA는 ORM을 사용하기 위한 **자바의 표준 명세(API)**다. 즉, JPA는 “ORM은 이렇게 동작해야 한다”고 정의한 일종의 인터페이스다.

  • JPA는 규약일 뿐이다: JPA는 그 자체로 어떤 기능을 수행하지 않는다. 마치 “자동차의 운전대, 가속 페달, 브레이크는 이렇게 생긴다”고 규정한 법규와 같다. 실제 자동차의 엔진이나 부품을 만들지는 않는다.

JPA 명세가 있음으로써 개발자들은 특정 ORM 구현체(예: Hibernate)에 종속되지 않고 개발할 수 있다. 나중에 다른 JPA 구현체로 변경하더라도 코드 수정이 거의 필요 없는 장점을 갖는다.

4.3. 하이버네이트 (Hibernate)

하이버네이트는 JPA 명세를 구현한 구현체(Implementation) 중 하나다.

  • JPA와 하이버네이트의 관계: JPA라는 인터페이스를 하이버네이트라는 클래스가 구현한 관계다. 우리는 실제로 하이버네이트를 사용하여 ORM 기능을 활용하지만, 코드는 JPA의 규칙을 따르는 방식을 취한다.

정리하면 다음과 같은 계층 구조를 갖는다.

  • 사용자 코드 (JPA API) JPA 구현체 (Hibernate) JDBC API 관계형 데이터베이스 (MySQL, Oracle 등)

5. ORM과 JPA의 장단점 심층 분석

이제 ORM과 JPA가 가져다주는 실질적인 장점과 단점을 자세히 살펴보겠다.

5.1. 장점 (Pros)

  1. 비즈니스 로직에만 집중 가능: 개발자는 SQL 작성과 JDBC 연동이라는 부수적인 작업에서 벗어나 핵심 비즈니스 로직을 개발하는 데 집중할 수 있다.

  2. 생산성 향상: findByName()과 같은 간단한 메소드 호출만으로 원하는 데이터를 가져올 수 있어, 개발 속도가 매우 빠르다. 이는 특히 신규 프로젝트에서 큰 강점이다.

  3. 유지보수 용이성: 객체 중심의 코드는 가독성이 높아 유지보수가 쉽다. 또한, 데이터베이스가 변경되더라도 JPA 설정 파일만 수정하면 되므로 코드 전체를 수정할 필요가 없다.

  4. DBMS 종속성 감소: JPA는 특정 데이터베이스에 종속되지 않는 추상화 계층을 제공한다. MySQL을 사용하다가 Oracle로 변경해야 할 경우, 설정 파일의 드라이버 정보만 바꾸면 된다. 이는 대규모 시스템에서 매우 중요한 이점이다.

5.2. 단점 (Cons)

  1. 성능 저하의 가능성: ORM이 자동으로 생성하는 SQL 쿼리가 항상 최적화된 것은 아니다. 복잡한 쿼리의 경우, 개발자가 직접 작성한 SQL보다 성능이 떨어질 수 있다. 이 경우 @Query 어노테이션을 사용하여 직접 SQL을 작성하는 것이 좋은 해결책이다.

  2. 높은 학습 곡선: 처음 접하는 개발자에게는 객체와 테이블 간의 매핑, 영속성 컨텍스트, 지연 로딩/즉시 로딩(Lazy/Eager Loading)과 같은 개념이 매우 어렵게 느껴질 수 있다.

  3. 복잡한 쿼리 처리의 어려움: 여러 테이블을 조인하거나 복잡한 서브 쿼리를 사용하는 경우, ORM의 API만으로는 원하는 결과를 얻기 힘들 수 있다. 이 역시 직접 SQL을 작성하거나, 복잡한 쿼리 처리에 특화된 Querydsl과 같은 도구를 함께 사용해야 한다.


면접에서 “스프링이 무엇인가요?”라는 질문을 다시 받는다면, “스프링은 자바의 오픈 소스 애플리케이션 프레임워크로, 제어의 역전(IoC)과 의존성 주입(DI)을 통해 객체를 관리하고 객체 간의 결합도를 낮추는 것을 핵심 철학으로 삼습니다. 이를 통해 개발자는 비즈니스 로직에 집중할 수 있으며, 특히 ORM(JPA, 하이버네이트)과 결합하여 데이터베이스 연동을 객체 지향적으로 처리할 수 있는 강력한 환경을 제공합니다”라고 답변할 수 있다.

이번 기회를 통해 스프링의 핵심 개념을 제대로 정리했으니, 이제 자신감을 갖고 다시 도전하는 일만 남았다. 혹시 다음에는 Spring MVC가 어떻게 동작하는지, 혹은 Spring Boot의 편리한 기능들이 어떻게 이 핵심 철학을 바탕으로 구현되는지 더 자세히 알아보고 싶은가. 언제든지 말해주기 바란다.

1. 🤔 스프링이란 무엇인가?

  • 스프링은 ==개체 관리 컨테이너==를 제공하는 ==오픈 소스 애플리케이션 프레임워크==이다.
  • MVC는 스프링의 라이브러리 중 하나이며, ==스프링 코어==와 함께 사용된다.
  • 특정 기술에 종속되지 않고 순수 자바로 사용 가능하다.

1.1. 컨테이너의 역할

– 공통적으로 사용되는 객체를 ==공유==하고 ==관리====한다.
– 객체를 생성, 제공, 반납====하는 역할을 수행한다.
– 예전의 EJB의 복잡성을 해소하고 단순하게 사용할 수 있도록 설계되었다.==

2. 💉 의존성 주입 (Dependency Injection, DI)

  • 의존 관계를 ==자동으로 연결==해주는 기술이다.

2.1. DI 동작 방식

==– 컨테이너에 객체를 등록한다.
– 객체 간 의존 관계를 설정한다.
– 스프링 컨테이너가 의존 관계를 자동으로 연결한다.==

2.2. DI의 장점

==– 직접 객체를 생성하거나 검색할 필요가 없다.
결합도==를 낮추어 유연한 코드 작성이 가능하다.

3. 🔄 제어의 역전 (Inversion of Control, IoC)

  • ==프레임워크==의 특징 중 하나이다.

3.1. 프레임워크 vs 라이브러리

==라이브러리==: 외부에서 가져와 사용하는 도구 (ex. ==Math.random()====)
프레임워크==: 전체 흐름이 정해져 있고, 개발자는 정해진 틀 안에서 코드를 작성한다.

3.2. IoC 동작 방식

==– 스프링 컨테이너가 전체 흐름을 제어한다.
– 개발자는 컨테이너 내에서 필요한 로직만 구현한다.==

3.3. IoC의 의미

==– 제어권이 개발자가 아닌 프레임워크에 있다.
– 프레임워크가 필요에 따라 사용자 코드를 호출한다.==

4. 📊 객체 관계 매핑 (Object-Relational Mapping, ORM)

  • 관계형 데이터베이스(RDB) 데이터를 객체 지향 언어(OOP)로 변환하는 기술이다.

4.1. ORM의 개념

– 데이터베이스 테이블을 ==클래스====로 매핑한다.
– 테이블의 행(row)을 클래스의 인스턴스==로 표현한다.

4.2. ORM의 장점

==– SQL 쿼리 작성 및 데이터 파싱 과정을 줄여준다.
비즈니스 로직==에 집중할 수 있게 해준다.

5. ⚙️ JPA (Java Persistence API)

  • ORM 기술을 사용하기 위한 자바 표준 API이다.

5.1. JPA의 특징

– ORM을 위한 ==인터페이스 집합이다.
– 실제 구현체는 하이버네이트(Hibernate) 등을 사용한다.==

5.2. JPA의 역할

==– 자바 객체와 DB 테이블 간의 매핑을 정의한다.
– 하이버네이트와 같은 구현체를 통해 실제 동작을 수행한다.==

6. 🌟 ORM, JPA, 하이버네이트의 장점

  • 비즈니스 로직에 집중할 수 있다.
  • 객체 중심의 개발이 가능하다.
  • 메소드 호출만으로 데이터베이스 작업을 수행할 수 있다.
  • 생산성 향상 및 유지보수 비용 감소 효과가 있다.
  • 특정 데이터베이스에 종속되지 않는다.

6.1. ORM, JPA, 하이버네이트의 단점

  • 직접 SQL을 작성하는 것보다 성능이 약간 저하될 수 있다.
  • 복잡한 쿼리 처리가 어려울 수 있다.

대본

[음악] 안녕하세요 창고입니다 4 그러면 오늘은 스프링 시작해볼게요 전을 스프레이에 대한 좀 안좋은 기억이 있어요 어 제가 예전에 야 어디 어디 면접 봤을때 어 그때 코딩 테스트 합격하고 어느 얼마 안 됐거든요 그래서 아예 면접에 대한 증거를 아 아야 못했던 상태였어요 근데 처음 코딩 테스트 다크 쓰니까 이제 불이야 불이야 이제 막 면접을 준비하는 시작을 했어요 그런데 스프링 이란 존재가 더 커 보이는 거 스크린과 라는 과목이 그래서 아무 거에요 내가 시간에 부족한 다이 스프링을 다 할 수 있을까 이뻐서 아 스프링은 포기를 하자 대신에 따른 것에 집중을 하자 생각을 하고 스프링 미안 했어요 그리고 면적 은계 가서 이제 몇 한 두 번째 질문이 스프링의 대해서 알고 있냐고 물어 봤어요 그래서 제가 모르겠다고 왜냐면 하는데 저도 좀 나름 당당했던 게 스프링 인 대학 종교 과정이 아니잖아요 아까 스프리건 이제 그냥 어떤 기술 우스 하 용한 거지 그게 그 면접 때 당연히 안 할 때는 아니라 살았거든요 엄마 그래서 모른다고 하니까 당황을 했어요 면접관들이 걸어 오서는 발목 c 스프링의 대해서 알고 있는 권 와도 얘기해 봐라 o 모 모 컨트롤 모여 총 많아서 뭐 끌어올 알고 있다 모임에서 있는걸 알고 있다 라고 했죠 그리고 나머진 같아요 잘 했거든요 떨어졌어요 그만큼 스프링이 중요한데 그 망 그 그래서 스프링 하면 시작해볼게요 근데 지금 화면은 그렇게 9 때 학교라 쓰면 한 6개월을 좀 빨리 쭈그렁 거거든요 그런데 그자들이 잘 문화 쓸 거 같아요 왜냐면 코로나 때 잖아요 그래서 코로나 때라서 뭐 6개월 빨리 접했다고 하는 뭐 비슷하지 않았을까 그래서 여러분들 지금 좀 회원 의식이 네요 이 취업준비 생활을 그 코로 나랑 함께 본다는게 행운이에요 많은 지금 대학교 신기한 보세요 얼마나 불쌍해요 걔는 지금 맨 티라 세토 아무것도 못 같잖은 벌써 이 2항은 지났나 그러면 얘는 우리 코롤라 그 샤워 1 양은 이야기 하진 않아 아무튼 그걸 우리는 그나마 지금 축복받은 세대다 그나마 그나마 라고 생각하고 그러면 지아를 볼게요 자 스프링 대해서 설명을 해볼게요 자자 우는 오늘 스프레이 뭐라 5 보통 놈들 알고 뜻이냐면 은 더 mbc 1월 9일 mbc 그래서 뭐 컨트롤러로 요청 받아서 모노 모델을 통해서 서비스 호출 해서 처리한 다음에 비유 로 응답한다 이렇게 보통 알고 계시거든요 근데 mbc 는 그냥 어 스프링의 라이브 롤링 중의 하나 의 스프링 mvc 에요 그래서 거기에다 보통 뭘 같이 써야 면 스프링 스크 린코를 같이 쓰거든요 그런데 지금 스프링이 뭐냐고 물어보는 것은 이 코너는 물어보고 에코 오르 그래서 오늘 이 스프링의 데이 뭔지 한번 쉽게 설명해 볼게요 자 스프링을 개체를 관리할 수 있는 컨테이너를 제거하는 프레임워크 자 손 태너 를 제공해 자 무슨 말이냐면 은 자 예를 들어볼게요 원리가 a 라는 클래스에서 허 와 있고 이라는 클래스가 있고 c 라는 클래스가 있어요 근데 여기서 가까 어 디 라는 클래스 의 인스턴스 잉 d 를 사용 오래요 그래서 우리 d 를 사용하고 뒤를 사용하고 d 를 사용해 이렇게 사용해야 된다고 가정해 볼게요 이 공통적으로 사용하는 객체 갈 따고 써볼게요 그러면 어떻게 해야 되냐면 은 여기서 d 를 새로 생성해야 되요 그 다음에 이 밑에 써야죠 여기도 마찬가지로 뒤를 새로 생성 을 한 다음에 * 써야죠 2 b 에서 a 를 가져올 수 있는 방법이 역사는 한국 c 도 마찬가지고 뒤는 새로 생성해서 써야죠 이게 얼마나 비효율적이고 그럼 메모리에 지금 기가 밖에는 거야 d 가 3개가 입니다 결국 같은 기능을 하는데 3개 가서 3개가 이걸 막고자 2 1 r 2 제품 토로 사용하는것은 같이 쓸 수 있게 같이 쓸 수 있게 이 컨테이너를 제공하는게 띠링 호오 에 그래서 개체를 관리할 수 있는 컨테이너를 제공한 게 스프링 이라는 기술이 에 출발이 에요 그래 예전에는 예전에도 이런 것들이 존재를 했어 때요 그때는 2 jb 랑 게 있을 때 이제 네 이제 이 비는 어 따른 어떤걸 상속받아 야 되고 뭐 구현해야 되고 암튼 그 복잡해 때 사용하는게 그래서 이거에 대한 불만을 가지고 만든 게 이제 스프링 이에요 스프링은 어떤 다른 기술을 사용할 필요없이 그냥 쑨 수 잡아 로 사용할 수 있구요 이렇게 해서 개체를 관리하는 역할을 하게 됩니다 4 쉽죠 그래서 정말 막 입지를 관리할 수 있는 선택 뭐야 그냥 공통적으로 사용하는 객체 를 가져다 쓰고 반납하고 쓰고 발랐고 이런 선택했네요 자 그 그리고 오픈소스의 내게도 잠깐 약해요 자 지금 뿐 소스 란 누나가 있어요 오픈 서버 냐 면 그냥 소스를 다운 떠나는 거예요 자 내가 힘 저 개발은 어 프로그램을 왜 우 뿐 노래요 미쳤다 고 보여 높은데요 근데 이 오픈 하 자는게 이 프로젝트의 이후 이 의해 그래서 내가 소스를 그냥 누구나 볼 수 있고 쉽게 접근할 수 있어요 미국 나에게 기능을 추가 할 수 있어요 근데 여기에 심사 과정이 들어가겠죠 그래서 모토가 될 수도 있고 안 통할 수 엄청 이런식으로 모두가 코드를 공유하고 분 대해서 사용한게 오토 스스로 쓰고요 자바를 사용하는 곳에서 대표적인 오픈 소스가 습득 일이에요 자 그래서 정리를 하자면 뭐 만약 에스프리 뭐냐고 물어보면 전을 어 자바의 오픈 소스 애플리케이션 크레인 머프 중의 하나로 흐린 기분 철암 은 특정 기술에 종속되지 않고 개체를 관리할 수 있는 프레임워크를 제공하는 곳입니다 그래서 헌 펜으로 잡아 해체를 관리하면서 의존성 주입과 재화 의 역설 을 통해 결합도 를 나치 됩니다 라우 자위 조성 주입과 제의 역전은 제 아끼고 캐서 설명을 할게요 자 그럼 의존성이 없죠 아 의선 썩 주입을 볼게요 자 우리 중 안 싸울 수입은 자기 말이 정말 바로 저도 이거 몇번 처음 본 것들도 가 의존성 수익은 위저 관계를 자동으로 연결되는 거라고 하는데요 자 a 라는 클래스가 있어요 그리고 b 에서는 개 일을 가져다가 쓸 거에요 그러면은 어떻게 얇 원래는 a 라는 개체를 여기에다가 만들 만들어서 만들어서 사용을 해야겠죠 근데 스프링 을 사용하면 된다 있어요 이 컨테이너에 헌 페인 5에 이를 등록을 해 가지고 이를 위해서 선택을 가져다 쓴다고 했죠 자 그러면은 결국에는 a 를 a 라는 객체를 생성해서 선택 애널에 올려야 되는 과정이 필요하고 이라는 객체에서 일하는 곳에서는 선택만 에서 a 를 가져오는 과정을 필요하잖아요 이 과정들을 카우 핑 스프링에서 직접 해준 가능 거예요 그러니까 우리가 이 필요 없이 자 그러니까 e 에서의 a 를 쓴 다이와 에서 a 를 쓴 아이 의존관계 만 설정하면 은 나머지는 스프링에서 자동으로 연결을 해줍니다 이게 귀 아이예요 자 그래서 dg 이는 디펜 건씩 입행 넌 씨는 어떤 것 의 준 화단을 이에요 그래서 의존하다 능곡 그러니까 교체 재앙에서 위중한 단 개념을 여기서 또 다른걸 사용한다 a 라는 것을 사용한다 라는 것이 우정 않다구요 왜 이어 의존한다는 거의 없는 애니가 없다 고 처 봐요 그럼 더이상 삐는 사용이 안되요 그래서 위중 한다는 개념을 사용하고 에디 펜 던 c 인젝션 진입 그래서 이것을 e a 의 좀 하니까 a 를 주입해 준다 이게 die 그 정리하자 너는 di 가 뭐에요 라고 면서 깔 물어보면 저는 di 는 t 밴시 인젝션 의 약자로 의존성 주입 을 의미합니다 개체 단 의 종헌 를 설정해 두면 스프링 컨테이너가 위증 관계를 작용으로 연결해줍니다 이렇게 되면은 직접 의존하는 객체를 생성하거나 생성하거나 아니면은 어 검색해서 가져올 필요 없어서 결국 또 가 낮아지는 장점이 있습니다 라고 대답하게 써요 4 그럼 다음은 ioc 할게요 아이유 씨는 이거는 뭐냐면 크림 어떻게 특징 이 되기도 해요 프레임워크의 자 프레임워크 말 이고 와 대비되는 것이 라이브러리가 있어요 자 라이벌이 가 뭐냐면은 자 우리가 어 예를 들어서 렌 도움을 사용하려면 자바에서 웬 덤을 사용하려면 어떤 어떤 또 클래스를 가져왔어 여기서 된 다음 하고 때는 넘버를 뽑 쩍 뭐 별러서 뭐 매스 점 렌덤 이렇게 목적 이렇게 밖에서 가져오는 걸 라이브러리 될 거에요 자바에서 직접 제공하지 않고 외모에서 가져서 사용하는 것을 라이브러리 라구요 자 그러면은 우리가 주사위를 부릴 때 뭐 주사위를 굴리는 프로그램이 짠다고 했어요 그럼 aslan 넘 하고 이렇게 숫자를 가져와서 애인의 가져온 다음에 시스템 어쩜 프린트 앤 해가지고 내일을 못봄 이런 어떤 메소드를 잔다고 해요 그러면 이런 전체 흐름 전체 내가 실행하는 거리를 누워 짜요 내가 짜요 그래서 그때 라이브러리를 활용해서 그래서 전체 인 오직 이 어떻게 진행 지를 짜는 것을 체어 번 이라구요 그래서 내 프로그램 전체를 내가 제어하고 있어 재원 것 제 5번 이상 개발자를 있어요 개발자 즉 사용자의 있어요 근데 흐름 오크를 짜 사용하면 어떤 일을 할 사람은 요 플레이 놓고는 흐림 워크가 전체의 흐름이 이미 정해져 있고요 우리 그 그럼 사용자 즉 개발자들은 이 증가한 정가네 비어있는 곳을 내용을 추가하는 것 밖에 없어요 여기 여기를 내용을 추가한 후 게 흐름이 먹고 다시 정리하자면 프레임워크는 전체 흐름이 정해져 있고 우리는 그 내용을 짜는 거에요 이곳이 제어 번의 역조 니라고 그러니까 기존에는 사용자가 개발자가 코드를 짜서 전체 코드의 흐름을 내가 정리해 봤는데 이제 프레임워크 에서는 그게 프레임워크에서 전체 흐름을 정해 하고 우리는 그 중간 증감을 짜 넣는다 이게 아이 것이오 잠 스프링 에서는 어떻게 되면 스프링이 프레임워크 중에 하나 거든요 왜냐하면 은 이게 지금 컨테이너가 이렇게 유지되기 때문에 컨테이너에서 이 컨테이너가 어 진행되면서 이제 그 의존 관계에 있는 객체들을 생성하고 이 컨테이너에서 관리하고 그 다 쓰면 여기서 소멸하고 이런식으로 전체 컨테이너에 흐름이 정해져 있고 우리는 그 컨테이너를 중간 요걸 어떻게 살 왔지만 그 짜 넣는 거에요 이해가 가시죠 정리할게요 ioc 가 뭐에요 라고 물어보면 전을 ioc 는 인 벌 정답 5 컨트롤 약자로 재활 역전 을 의미합니다 그치 어 거니 사용자에게 있지 않고 프레임워크의 있어서 필요에 따라서 사용자 코드를 호출 하게 될 것입니다 그래 스프링 에서는 인스턴스의 생성 부터 소녀까지 개발자가 아닌 컴퓨터에서 계속 불리하게 됩니다 라고 말하겠어요 그러면 바로 ioc 까지 부여 다음은 이제 orm 을 넘어 갈게요 자 orm 은 5 광기 0 데이터베이스를 우리 op 언어 로 변환해주는 기술 일이구요 우아 r 애미야 자 오해들 객체 릴레이션 어는 관계형 데이터베이스 여기가 관계 0 idb 대응이 에 쓰잖아요 이 아래에 짜고 요렇게 영어로 되십니다 얘기 자오 또 무슨 얘기냐 며 는 우리가 데이터베이스의 고객이라는 테이블이 다 구축해야 그래서 이름 5 어전 맘 언어 그리고 뭐 성별 이런것들이 따고 치키 요 그래서 이렇게 테이블이 이런 식을 쭉 있겠죠 관리가 되겠죠 기존에는 이것을 허리를 통해서 데이터를 가져온 다음에 그 데이터를 뭐 관리를 하면서 어떻게 사용을 했었어요 근데 이제는 어떻게 되냐면 2호 아래 위해선 어떻게 하잖아요 하는거면 은 고객 이라는 클래스를 하나 만들어서 여기에 이름 서나 버너 그래서 성별이 라는 필드를 넣자 하는거예요 그래서 하나의 객체 암에 이 한 줄이 이렇게 들어와 하나의 객체 안에 한줄이 들어가도록 만들자 이렇게 객체와 케이블 매핑 시키 잘하는게 or m 이에요 자 이렇게 하면 뭐가 좋냐 군요 뭐 이런 허리를 짜고 가져와서 이제 과 저와 서 그것을 파싱을 해요 하심이라 근거는 그 데이터를 사용하기 쉽게 처리 해주는 거에요 하심 한 다음에 뭐 그 자유석 땅은 자리 구조의 넣었고 이런 과정들이 필요가 없어져요 그래서 오르 질때가 짜고 싶은 코드 그 코드 에만 집중할 수가 있어요 그런데 내가 짜고 싶은 포드를 뭐라고 하려면 비즈니스 코 더라구요 그래서 비즈니스 코드의 집중할 수 있다는 장점이 있어요 자 그럼 가시죠 니 하자면 우아 램이 뭐예요 라고 보려구요 저는 오행은 오브젝트 릴레이션 래핑이 짜로 관계 5 데이터베이스를 op 언어 그러니까 그 개체 지향 프로그래밍 언어로 별로 해주는 기술입니다 그래서 비즈니스 코드가 db 테이블에 바로 첩부 나게 도와 줍니다 라고 말했어요 4 그러면 다음에 재개 해볼게요 jp 는 뭐냐면 자 아까 말한 그 orm 있죠 orm 을 활용하고 싶어요 어떻게 하려고요 뭐가 있어야 되잖아요 어 자바에서 활용하려고 2호 rm 을 가지고 오는데 가져 오는데 이때 jp a 라는 개념을 잡아 해선 안될 jpa 이라는 개념을 만들어서 너 내가 이 조의 규제 확대 로만 맞춰서 안들어 배신의 대가 2주 양만 만들어 이렇게 라고 정해 놓은 게 jp 그래서 이거는 인터페이스가 고요 인터페이스 라서 어떻게 구현되는 게 없어요 그 말이 뭐냐면 함수가 직접 짜장 있는게 없어서 실행이 불가능 대신에 달 뭐 회사들이 이제 이 피해를 가지고 와서 자기가 그 아넬 비어 있는 함수를 채워 넣어 가지고 사용할 수 있도록 하는 거야 자 그래서 자의 피해가 뭐냐면 orm 을 위해서 사바 에서 제공하는 api 가 있어 api 를 jp 해 라고요 대표적으로 대표적으로 하이버네이트 가 있어요 하이버네이트 는 jp j 의 자바의 jpa 를 중요한 거에요 임플 문 다운 거죠 그러니까 이거는 인터페이스 고 이거는 클래스 가지고 있죠 2 jpa 인터페이스를 구현한 그래가지고 우리가 실질적으로 사용하는 것은 하이버네이트 가 될 거에요 자금 정리하자면 jp 가 뭐에요 라고 그러면은 4 jpa 는 orm 을 위해서 자바에서 제공하는 api 입니다 자바 객체 와 db 테이블을 매핑하는 데 어 구현체 로는 하이버네이트 가 있습니다 라고 말할 거에요 4 그러면 마지막으로 우아한 엔 제이 피의 하이퍼 네이트의 장점에 대해서 하고 마무리 할게요 자 우선 을 봤다 얘기한 것처럼 orm 을 사용하면 요그 쿼리를 가져와서 실행하고 8c 나고 그 과정이 없어져요 그래서 비즈니스 로직에 집중할 수 있고요 그리고 이 아까 그 테이블을 객체로 만나고 있자나요 객체를 가지고 활용해서 더 활용에서 객체 중심의 개발이 가능해져 그래서 객체 중 10 자 두 번째는 요 어 기존에는 sql 을 작동한 다음에 그걸 어 실행한 다음에 글리 절대 셋을 가져와서 그러 처리해 주는 그런 절차를 배 짝 했거든요 그 제께 1 이전에는 근데 이제는 매수도 호출을 하면 끝날 그래서 열리며 는 빠 2절 파인드올 이렇게 하면은 그거 끊고 기 있는 테이블을 자 봐요 이런식으로 메쏘드 호출 만으로도 끝나서 생산성이 형상 되요 생산성이 낙원은 일을 더 잘 안하고 그러니까 짧은 시간에 일을 더 잘할 수 있게 되요 그리고 코드가 쉽다 보니까 유지보수가 쉬워져요 이은주 모순 비용도 감소 해요 자 이렇게 하면 다 좋죠 근데 하나도 좋은게 이 db 의 존 하질 않아요 이게 무슨 말이냐면 은 도니가 마이 sql 일로 작성을 했어요 근데 이 어 갑자기 고객사에서 마이스키 해봤고 오라클로 해 달래요 그럼 기존에는 난리예요 그러면 my 스케일러 작동된 쿼리 랑 오라클로 작성된 허리랑 으로 쭉 조금씩 다르거든요 그럼 2벌 이걸로 변환을 해줘야 될 거에요 이 것들에도 일이란 말이에요 근데 어 하이버네이트 보안 해제 기에는 할 필요가 없어요 그냥 어 그냥 그 함수만 실행을 하면 은이 메쏘드 만 실행을 하면 은 이 아내 에서 않아서 이마이 스켈 앙 오라클로 배낭 해주거든요 우리는 설정 정보 번만 기존의 마이스키 로 설정된 것을 올라 꼴로 바꿔 주면 안되요 그러니까 어떤 지위에 의존하지 않아야 어떤 8i db 에 그래서 마음대로 바꿀 수 있다 이 말이요 자 이렇게 봄 장점을 있는 것 같잖아요 근데 단점은 조금 있어요 단장 쫓는 게 뭐냐 며 이런 식으로 철회를 안에서 해 주다 보니까 내몰 오직 이 있을 거 아니에요 그러다 보니까 직접 내가 sk 를 작성해서 n 터칭 것보다는 조금 더 드려요 성능이 조금 떨어지구요 두번째는 이제 복잡한 아주 복잡한 거리들이 있어요 뭐 복잡하고 는 라이프 이즈 1부작 넘어가는 허리 들도 있거든요 넘 버클로 또르르 이제 여야 이걸로 수행하기 하이버네이트 옥주현 하니까 어려워요 그래서 이런 단점들을 가지고 그럼에도 장점이 너무 퍼서 실질적으로 이제 현업에서 는 잛은 표를 많이 쓰죠 네 그럼 정리를 할게요 자 이제 면접관이 o 아래 대피할 번에 잎의 장난 짜 마음 설명하세요 라면 저는 비즈니스 로직에 집중하고 객체 중심의 개발을 할 수 있게 됩니다 그리고 매 손을 를 호출하는 것 만으로도 홀딩스 항에서 생산성이 향상되고 옆에 2시 비용이 줄어 2 예지 보스 병이 줄어듭니다 그리고 특정 데이터에 있어요 의존 하지 않게 됩니다 하지만 단점으로는 직접 sql 호출 한 것보다는 조금 드리구요 그리고 복잡한 쿼리 같은것은 메소드로 처리가 힘들다는 글자 놓습니다 라고 대표 돌았어요 예 그럼 이렇게 오는 이제 스프링이 알아봤는데요 오드 쓰고 정말 많으셨고 고지가 얼마 안 남았으니까 조금만 웨딩 헤어 그럼 안뇽