1. IoC(제어의 역전), DI(의존성 주입)
*주입은 필드에 직접,메소드,생성자 형식으로 있는데 주로 생성자 주입을 사용한다.
-왼쪽부터 차례대로 생성자,직접,메소드 방식
*제어의 역전은 왼쪽 코드 보면 Consumer가 직접 Food를 만들어 먹었기 때문에 새로운 Food인 피자를 만들려면 피자 자체를 새로 만들고 Consumer에도 추가해줘야해서 여러곳의 코드 변경,추가가 필요하다.
* 이를 해결하기 위해 만들어진 Food를 Consumer에게 전달해주는 식으로 변경함으로써 Consumer는 추가적인 요리준비(코드변경) 없이 어느 Food가 되었든지 전부 먹을 수 있게 됬다.
* 해결전에는 제어의 흐름이 Consumer → Food 였는데 이후에는 Food → Consumer 로 역전 되었다.
2. IoC Container와 Bean
* DI를 사용하기 위해서는 객체 생성이 우선 되어야 했다. 그렇다면 언제 ?, 어디서 ?, 누가 ? 객체 생성을 해야 할까 생각는데 바로 Spring 프레임워크가 필요한 객체를 생성하고 관리하는 역할을 대신 해준다.
이 부분을 ioC Container와 Bean을 이용해서 한다.
* bean은 메모 프로젝트로 생각해봤을때 MemoController,MemoService,MemoRepository들 말하고
ioC Container는 bean의 객체들 MemoController,MemoService,MemoRepository을 보관하고 있는 공간을 생각하면 된다.
* bean을 등록 할땐 bean으로 등록하고자 하는 클래스 위에 @Component 어노테이션 적어주면 되는데
3 Layer Annotation에 의해 @Component 말고 @Controller, @RestController, @Service, @Repository 로 해도 bean으로 등록된다. ( @Service 정의위치 가봤을때 이렇게 @Component를 포함하고 있다)
* @Component만 하면 알아서 bean으로 등록되나? 하지만 사실 @Autowired라는걸 생성자 메소드 위에 적어줘야하는데 스프링 4.3이후부터 @Autowired 생략해도 생성자가 1개일시만 자동으로 해준다. 하지만 오버로딩된 생성자가 2개 이상 있을시 꼭 적어줘야한다
*클래스 위에 @RequiredArgsConstructor를 사용하면 바로 final을 생성자로 가져간다
private final MemoRepository memoRepository; 이렇게 fianl있으면 바로 생성자 메소드 없어도 객체를 만들어주는데 fianl 없으면 안한다.(이부분은 크게 중요한건 아니지만 나중 일할때 사용 할 수도)
* 컨트롤러는 서비스를 가져다 사용, 서비스는 레포지토리를 가져다사용
그럼 컨트롤러 자체는 어디서 사용되는거지 생각드는데 DispatcherServlet이 Handler Mapping을
통해서 어떤 컨트롤러인지 찾는다 했었는데 찾은 다음에 그 컨트롤러의 메소드 호출해야 하는데?
그때 스프링에서 ioC Contatiner에 등록되어있던 컨트롤러 Bean객체를 전달해주는거다
3. JDBC
JDBC
* 자바 언어를 사용하여 DB와 상호 작용하기 위한 자바 표준 API(응용 프로그래밍 인터페이스)
* 다른 DB로 갈아타면 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법등을 애플리케이션 서버에서 작성했던 DB 연결 로직들을 전부 수정 해야하는데 이런 문제를 JDBC로 해결 할 수 있게 되었다.
* DB 회사들은 자신들의 DB에 맞도록 JDBC 인터페이스를 구현한 후 라이브러리로 제공하는데 이를 JDBC 드라이버라 한다.
JdbcTemplate
*JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 아직도 DB에 연결하기 위해 여러가지 작업 로직들을 직접 작성해야한다는 불편함이 남아 있다.( 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업) 이걸 해결해주는 JdbcTemplate이 있다.
* application.properties에서 ↓ 적용해주면 된다. (밑에 캡쳐는 예시)
4. JPA
* JPA는 Java전용 ORM 기술을 뜻한다.
* JPA는 애플리케이션과 JDBC 사이에서 동작되고 있고 JPA를 사용하면 DB 연결 과정을 직접 개발하지 않아도 자동으로 처리해준다 (장고의 orm자체랑 비슷하다 보면 될듯)
* 또한 객체를 통해 간접적으로 DB 데이터를 다룰 수 있기 때문에 매우 쉽게 DB 작업을 처리할 수 있다.
5. Entity
* JPA에서 관리되는 클래스 즉, 객체를 의미하고 Entity 클래스는 DB의 테이블과 매핑되어 JPA에 의해 관리된다.
* Entity 밑에 예시 코드를 보면
- @Entity(name = "Memo") 는 (name = "Memo") 클래스 이름을 지정할 수 있는데 안적을시 (default: 클래스명)으로 한다.
- JPA가 Entity 클래스를 인스턴스화 할 때 기본 생성자를 사용하기 때문에 반드시 현재 Entity 클래스에서 기본 생성자가 생성되고 있는지 확인해야하는데 밑에 예시 코드보면 오버로딩 생성자 없으니 기본생성자가 있다.
- @Table 는 매핑할 테이블을 지정해주고 (name="memo") 으로 매핑할 테이블의 이름을 지정할 수 있다.
안적으면(default: 클래스명) 이고 테이블명이 소문자 memo로 설정
- @GeneratedValue(strategy = GenerationType.IDENTITY) 에서 @GeneratedValue어노테이션은 프라이머리키 자동 생성을 말하고 (strategy = GenerationType.IDENTITY) 는 이전에 데이터베이스에 저장된 값 중에서 가장 큰 값에서 1을 증가시켜 새로운 값으로 설정하는걸 뜻한다.
@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
public class Memo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// nullable: null 허용 여부, false이면 허용하지 않고 nullable생략하면 기본True로 설정
// unique: 중복 허용 여부 (false 일때 중복 허용)
@Column(name = "username", nullable = false, unique = true)
private String username;
// length: 컬럼 길이 지정
@Column(name = "contents", nullable = false, length = 500)
private String contents;
}
'Spring' 카테고리의 다른 글
Spring_4주차-(1) (0) | 2023.11.10 |
---|---|
Spring_3주차-(1) (0) | 2023.11.07 |
Spring_2주차-(2) (0) | 2023.11.02 |
Spring_1주차-(2) (0) | 2023.11.01 |
Spring_1주차-(1) (0) | 2023.10.31 |