나를 기록하다
article thumbnail
반응형

Spring

  • 객체를 관리할 수 있는 컨테이너를 제공하는 프레임워크

예시

공통적으로 사용하는 객체가 있다고 가정

 

A 클래스, B 클래스, C 클래스가 있을 때 D 클래스의 인스턴스인 d를 사용하려면 메모리에 d를 3개(A, B, C 각각 생성) 생성해야함.

→ 같은 기능을 하는 d가 메모리에 3개가 존재하므로 굉장히 비효율적

→ 공통으로 사용하는 하나는 같이 쓸 수 있게 컨테이너를 제공하는 것이 Spring Core

 

과거에는 EJB가 존재했다.

EJB는 상속, 구현 등 복잡했다. 이것에 대한 불만을 가지고 만든 것이 Spring

Spring은 순수 Java로 구성되어 있고 객체를 관리하는 역할을 한다.

 

오픈소스란 소스를 오픈하는 것.

즉 모두가 기능을 추가할 수 있도록 개발한 소스를 오픈하는 것을 말한다.(심사 과정을 거쳐서 기능이 추가된다.)

Java 진영의 대표적인 오픈소스가 Spring이다.

 

정리하자면,

Spring은 무엇인가?
자바의 오픈소스 애플리케이션 프레임워크 중 하나로
스프링의 기본 철학은 특정 기술에 종속되지 않고 객체를 관리할 수 있는 프레임워크를 제공하는 것이다.
컨테이너로 자바 객체를 관리하면서 의존성 주입과 제어의 역전을 통해 결합도를 낮추게 된다.

DI

의존성 주입으로, 컨테이너가 의존관계를 자동으로 연결하는 것을 의미한다.

 

예시

A 클래스, B 클래스 존재할 때

원래 B에서 A를 가져다가 쓰려면 A라는 객체를 만들어 사용해야함.

Container의 역할

스프링에서는 컨테이너에 A를 등록해서 B에서 컨테이너를 가져다 쓴다.

A를 컨테이너에 올리는 과정과 B에서 컨테이너에서 A를 가져오는 과정이 필요

이 과정들을 스프링에서 직접 해준다.

 

B에서 A를 쓴다는 의존관계만 설정하면 나머지는 스프링에서 자동으로 해준다. → 이것이 DI(Dependency Injection)

객체지향에서 의존한다는 개념은 하나의 클래스에서 다른 클래스를 사용한다는 의미. (B에서 A를 사용한다.)

→ A가 없다고 하면 B에서는 A의 객체를 사용할 수 없다. → B는 A에 의존하기에 A를 주입해준다.

 

DI가 무엇인가?
DI는 Dependency Injection의 약자로, 의존성 주입을 의미한다.
객체간의 의존관계를 미리 설정해두면, 스프링 컨테이너가 의존관계를 자동으로 연결해준다.
이렇게 되면 직접 의존하는 객체를 생성하거나 검색해서 가져올 필요없어서 결합도가 낮아지는 장점이 있다.

IOC

우선 프레임워크와 라이브러리의 차이점을 알아보겠다.

라이브러리란?

random()을 사용하려면 Math.random() 이런 식으로 사용하는데 이와 같이 외부에서 가져오는 것을 라이브러리라고 한다.

예시

주사위를 굴리는 프로그램을 짠다.

public class Dice {

	...
    
    int a = Math.random();
    
    System.out.println(a);
    
    ...
}

위와 같이 전체적인 흐름을 내가 라이브러리를 활용하여 작성한다.

이렇게 전체 로직이 어떻게 진행되는지를 짜는 것을 제어권이라고 한다.

라이브러리만을 사용할 때는 프로그램 전체를 개발자(사용자)가 제어하고 있다.

 

프레임워크를 사용하면?

프레임워크가 전체의 흐름을 이미 정해둔다.

개발자들은 중간에 비어둔 곳에 내용을 추가하는 역할을 한다.

프레임워크는 전체 흐름이 정해져 있고 우리는 그 내용을 짜는 것 → 이것을 제어권 역전이라고 한다.(IoC; Inversion Of Control)

 

스프링에서는 어떻게 하는지?

스프링은 프레임워크 중 하나이다. 컨테이너가 유지되기 때문이다.

컨테이너가 진행되면서 의존관계에 있는 객체들을 생성하고 컨테이너에서 관리하고 다쓰면 소멸하고 이런식으로 전체 컨테이너의 흐름이 정해져있고 우리는 컨테이너의 중간에 어떻게 사용할지만 짜서 넣는 것.

 

IoC가 무엇인가?
IoC는 Inversion of Control로 제어의 역전을 의미한다.
제어권이 사용자에게 있지 않고, 프레임워크에 있어서 필요에 따라서 사용자의 코드를 호출하게 된다.
스프링에서는 인스턴스의 생성부터 소멸까지 개발자가 아닌 컨테이너에서 대신 관리하게 된다.

 


ORM(Object Relational Mapping)

관계형 데이터베이스(RDBMS)를 OOP언어로 변환해주는 기술

예시

DB에 고객이라는 테이블이 있고 테이블 안에는 이름, 전화번호, 성별 이런 컬럼이 있음.

기존에는 쿼리를 통해서 데이터를 가져오고 관리하면서 사용

ORM에서는 고객이라는 클래스를 하나 만들어서 이름, 전화번호, 성별이라는 필드를 넣는 것.

하나의 객체 안에 한줄이 들어가게 만든다.

위와 같이 객체와 테이블을 매핑시키자는 것이 ORM이다.

장점

쿼리를 짜고 가져와서 파싱을 한다(파싱: 데이터를 사용하기 쉽게 처리해주는 것)

적당한 자료구조에 넣고 이런 과정들이 필요없어짐.

내가 짜고 싶은 코드에만 집중할 수 있음.

(내가 짜고 싶은 코드 → 비즈니스 코드라고 함.)

 

ORM이 무엇인가?
Object Relational Mapping의 약자로 관계형 데이터베이스를 OOP언어로 변환해주는 기술이다.
그래서 비즈니스 코드가 DB 테이블에 바로 접근하게 도와준다.

JPA(Java Persistence API)

ORM을 활용하고 싶다. Java에서 ORM을 활용하려면 아래와 같다.

ORM, JPA, Java

Java에서 ORM을 활용하려고 ORM을 가져오는데 이때 JPA라는 개념을 만들어서 가져온다.

JPA란 규약이면서 인터페이스이다.

즉 구현되어 있는 것이 없다. 대신 다른 회사들이 JPA를 가져와서 비어있는 것을 채워넣는 식으로 활용한다.

ORM을 위해 자바에서 제공하는 API이다.

 

대표적으로 하이버네이트가 있는데 하이버네이트는 자바의 JPA를 구현한 것이다.

JPA라는 인터페이스를 구현한 하이버네이트(클래스)를 사용한다.

 

JPA란 무엇인가?
JPA는 ORM을 위해서 자바에서 제공하는 API. 자바 객체와 DB 테이블을 매핑하는데 구현체로는 하이버네이트가 있다.

ORM, JPA, Hibernate 장단점

장점

  1. ORM을 사용하면 쿼리를 가져와서 실행하고 파싱하는 과정이 없어짐 → 비즈니스 로직에 집중할 수 있음.
  2. 테이블을 객체로 만듬 → 객체를 가지고 활용해서 더 객체 중심의 개발이 가능해진다.
  3. 기존에는 SQL을 작성한 다음에 그것을 실행하고 result set을 가져와서 처리하는 절차들이 복잡했다
    → 이제는 메서드 호출 하나로 끝남. ex) findAll()
    → 생산성이 향상, 유지보수가 쉬워짐(비용 감소)
  4. DB에 의존하지 않는다.
    ex) MySQL → Oracle 변경 시 기존에는 굉장히 힘들었음 → JPA를 사용하면 설정 정보만 변경하면 된다.

단점

  1. 내부 로직이 있기 때문에 직접 SQL 작성할 때보다 성능이 조금 떨어짐.
  2. 복잡한 쿼리들은 하이버네이트로 구현하기 어려움.

 

→ 그럼에도 장점이 너무 커서 실질적으로 현업에서는 하이버네이트를 많이 씀

 

ORM, JPA, Hirbernate의 장단점 설명하라
먼저 장점으로는 비즈니스 로직에 집중하고 객체중심의 개발을 할 수 있게 된다.
그리고 메서드를 호출하는 것만으로 쿼리를 수행해서 생산성이 향상되고, 유지보수 비용이 줄어든다.
그리고 마지막으로 특정 DB에 의존하지 않게 된다.

하지만 직접 SQL을 호출하는 것보다 느리고 복잡한 쿼리같은 것은 메서드로 처리하기 힘들다는 단점 존재한다.

 

 

 

 

 

반응형

'CS > Interview' 카테고리의 다른 글

[Interview] JPA, 알고 쓰고 있을까?  (0) 2024.06.18
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...