미소를뿌리는감자의 코딩

[Spring] Entity & JPA & ORM와 IoC & DI 본문

강의수강/[Spring]

[Spring] Entity & JPA & ORM와 IoC & DI

미뿌감 2024. 3. 4. 15:03
728x90

파일을 구성할 때,

controller, service, repository로 구분하여 만든다.

이를 통해서, 역할을 구분하여 폴더를 만들어, 수정에 용이하게 하기 위함이다.

- controller : 신호를 주고 받는 역할

- service : main 흐름 결정

- repository : DB와 관련된 부분

 

<lombok>

- lombok은 주로 반복절으로 작성해야 하는 코드 ( getter/setter/toString()) 과 같은 것들을 annotation을 통해 자동으로 생성해 주는 라이브러리 이다.

- lombok을 사용하기 위해서는 build.gradle에 lombok 라이브러리를 추가하면 된다.

 

<Entity & JPA & ORM>

1. Entity

DB 테이블에 해당하는 데이터를 Java 객체로 표현한 것.

@Entity annotation을 사용하여 entity class를 정의. table의 column에 해당하는 필드를 가지고 있음.

JPA를 사용하여 entity를 관리함.

 

2. JPA [ Java Persistence API ]

JPA는 ORM 기술의 일종.

개발자가 직접 SQL을 작성하는 대신 객체를 통해 데이터를 조작할 수 있게 해줌. 

Hibernate, EclipseLink, OpenJPA 등 다양한 JPA 구현체가 존재

 

3. ORM [ Object-Relational Mapping ]

객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 타잆 시스템을, 객체 지향적으로 사용할 수 있도록 변환하는 프로그램 기술을 말한다.

ORM을 통해 객체, 데이터베이스와 데이터를 mapping할 수 있도록 돕는다.

SQL 쿼리가 없이도 데이터베이스를 객체 지향적으로 조작할 수 있게 하는 기술이다.

 

<IoC & DI>

https://www.youtube.com/watch?v=1vdeIL2iCcM

- 추천 유튜브 -

1. IoC [ Inversion of Control ]

프로그램 원리 중 하나.

프로그램의 제어 흐름을 사용자가 아닌 프레임워크나 라이브러리 같은 외부 시스템에 위임하는 것을 말함.

제어 권한이 프레임워크에 넘어감. -> 코드 결합도 감소. 유연성 및 확장성 증가

 

2. DI [ Dependency Injection ]

컴포넌트 간의 의존성을 외부에서 주입하는 방식.

객체의 생성과 의존성 관리를 개발자가 직접 하지 않고, 외부 컨테이너나 프레임워크가 처리하게 하는 것.

- Spring container는 @Autowired, @setter @getter에 대해 자동적으로 DI를 주입.

 

즉, 풀어서 이야기 해보면,

DI은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 객체가 자신의 의존성(다른 객체나 서비스)을 직접 생성하거나 검색하는 대신, 외부의 독립적인 entity에 의해 주입받는 방식이다.

 

2-1) DI. Consturctor Injection (생성자 주입)

의존성을 객체 생성 시 생성자를 통해 주입하는 방식. 의존성이 변경 불가능하게 설정됨. 따라서, 객체가 생성될 때 완전한 상태를 가지게 된다.

@Autowired 어노테이션은 Spring에서 해당 생성자를 이용해서 의존성 주입을 자동으로 처리 하도록 함.

@Component
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

코드에 대해서 조금 설명해 보자면, UserService 생성자는 UserRepository 타입의 인자를 받는다. 

이는 UserService가 생성될 때, UserRepository의 구현체를 주입받아야 함을 의미한다.

 

 

2-2) DI. Setter Injection (세터 주입)

Setter method를 통해 의존성을 주입하는 방법. 객체 생성 후에도 의존성을 변경할 수 있어 유연성을 제공하지만, 객체가 완전한 상태로 생성되지 않을 수 있다.

@Component
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

 

2-3) DI. Field Injection (필드 주입)

클래스 내의 필드에 직접 의존성을 주입하는 방법.

코드가 간결해지지만, 테스트가 어렵고 의존성이 숨겨져 있어 권장하지 않음.

@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

 

3. Ioc와 DI 간의 관계

IoC는 더 넓은 개념. DI는 IoC를 구현하는 구체적인 기법 중 하나.

객체 간의 의존성을 외부에서 주입하여 관리하는 방식을 말함.

728x90