미소를뿌리는감자의 코딩
[Spring] Entity & JPA & ORM와 IoC & DI 본문
파일을 구성할 때,
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를 구현하는 구체적인 기법 중 하나.
객체 간의 의존성을 외부에서 주입하여 관리하는 방식을 말함.
'강의수강 > [Spring]' 카테고리의 다른 글
[Spring] intellij 에서 모든 파일이 .java로 바뀌어 인식이 안될 때 (Java file outside of source root intelliJ) (1) | 2024.03.08 |
---|---|
[Spring] @NoArgsConstructor - entity w. 기본 생성자 (0) | 2024.03.04 |
[Spring] compiler warning: local variable is redundant (0) | 2024.03.02 |
[Spring] HTTP 데이터를 객체로 바꾸는 법 (0) | 2024.03.01 |
[Spring] Jackson ( Jason to Object, Object to Jason ) (1) | 2024.02.29 |