반응형

의존, 의존성이란?
-> A는 B를 사용하기만 해도 A는 B에 의존한다 할 수 있다.
- ex) new() 쓰는거


의존성 주입 : DI(Dependency Injection)
- 의존성을 약화시키는 테크닉
- 필요한 값을 new해서 인스턴스화 하는게 아니라 외부에서 넣어주는거
- new() 는 사실상 하드코딩이다. 

 

의존성 역전(Dependency Inversion)
- DIP라고 부른다.
- 화살표의 방향을 바꾸는 테크닉이라고 보면 된다.
- 의존성 역전은 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
- 세부사항에 의존해서는 안되고 세부 사항이 추상화에 의존해야 한다.  

인터페이스와 구현을 분리  / 화살표 방향이 바뀜 -> 의존성을역전

 

 

 

반응형

무슨 이유인지는 모르겠지만 포트가 이미 실행 중일 때 스프링을 Run 하면 발생한 에러라고 한다..

해결방법
(윈도우)
cmd에서 netstat -ano를 실행 하면 현재 실행중인 포트 목록이 나온다.
여기서 8020포트에 해당하는 PID를 찾아서
taskkill/pid 0000 / f 
을 입력한다.

반응형

1. JPA는 Java Persistance Api다.
영속성은 데이터가 영구히 기록될 수 있도록 하는 것이다. 
JPA는 즉 자바에 있는 데이터를 영구히 기록할 수 있느 환경을 제공하는 API다. 

2. JPA는 ORM 기술이다.
ORM(Object Relational Mapping): Object를 DB에 연결하는 방법론,
자바 클래스를 만들어서 실행하면 DB에 테이블을 자동적으로 생성시킬 수 있다.

3. JPA는 반복적인 CRUD 작업을 생략하게 해준다.
기존 : 자바 프로그램이 DB에 커넥션을 요청 -> DB는 세션을 오픈 -> 오픈된 세션으로 자바 프로그램은 connection을 가짐 -> 다음 요청시에는 쿼리를 전송할 수 있음 -> DB는 쿼리를 기반으로 데이터를 만들고 자바에 응답 -> 응답한 데이터 타입과 자바의 데이터 타입이 다르므로 자바는 해당 데이터를 자바 object로 변경

하지만 JPA 사용하면 전송된 쿼리에 대한 응답이 있을때 응답을 자바 오브젝트로 바꾸고 연결된 세션, 커넥션을 끊는 일련의 작업을 단순한 함수로 제공해준다. 

반응형
필터

스프링컨테이너가 들고 있는 필터를 '인터셉터'라고 부른다.
인터셉터 또한 권한을 체크한다.

어노테이션 & 리플렉션

어노테이션
어노테이션은 사전뜻대로는 주석이지만 스프링에서 어노테이션은 컴파일러가 무시하지 않고 체킹을 한다.
스프링은 어노테이션으로 객체를 생성하기도 한다. 
ex)
@Component: 해당 어노테이션이 붙어있는 클래스를 메모리에 로딩해
                         특정 클래스에 해당 어노테이션이 붙어있으면 스프링은 그 클래스를 스캔해서 
                         자기가 들고있는 메모리공간(heap영역, 컨테이너)에 로드한다. => IOC
@Autowired: 스프링 컨테이너에  있는 클래스를 사용하고 싶을 때사용

리플렉션
 - 스프링이 B클래스를 스캔할 때 B클래스 내부에 어떤 것들이 있는지 분석하는 기법을 리플랙션이라 한다.
 - 리플랙션은 어떤 메서드, 필드, 어노테이션이 있는지를 체킹한다.
   또한 있는지를 체킹하는것을 넘어서 어떤 동작을 할지를 설정할수도 있다. 
 - 만약 @Autowired 를 발견하면 스프링 컨테이너를 쭉 읽어어서 A랑 동일한 타입의 객체가 있는지를 확인한다.
  만약 A가 없다면 null을 반환, 있다면 A를 DI한다.  
- 리플렉션은 런타임때 동작(분석)한다. 

Class B{
  @Autowired
  A a;
}

 

반응형
Inversion of Control(제어의 역전)

- 주도권이 스프링에게 있다.
- 클래스: 설계도
- Object: 실체화가 가능한 것
               ex) 롤 챔프 누누(Class)는 게임할때 튀어나오니까 실체화가 가능하다 => Object다.
                     하지만 캐릭터(abstract Class)는 추상적인 의미다. (애쉬가 될수도 있고, 케이틀린이 될수도 있다.)
                     캐릭터는 추상적인 것이기때문에 실체화가 불가능하다, 게임에서 등장 불가능 => Object가 아니다.
- Instance: 실체화가 된것 (누누가 전장에서 돌아다니면, 게임속에서 존재하는것)

주도권이 스프링에게 있다는것은
개발자가 직접 Object를 new해서 heap 공간에 올리게 되면 해당 레퍼런스의 주소를 각각의 메소드가 관리하게된다.
예를 들어보자

Public void make(){
	User user = new User(); 
}

예컨데 user의 주소는 make() 메소드가 실행되는 순간에 메모리에 뜬다.
그래서 다른 메소드에서 user를 사용하고 싶다면 아래와 같이 또 새로 new해야할 텐데 그럼 
heap메모리에 또다른  주소가 생기게 된다. 
또한 make메소드에서의 user와 make2 메소드에서의user는 다른 존재다.(주소가 다르기 때문) 

Public void make2(){
	User user = new User(); 
}

이렇게 되면 다른 매소드에서 같은 user를 공유를 하기 힘들어진다. 

스프링는 수많은 Object들을 스캔해서 그 객체들을 heap 메모리 공간에 올려준다.
이것을 IOC라고한다. 

DI란

스프링이 IOC를 통해 Object들을 메모리에 띄웠기 때문에, 스프링이 관리하기 때문에  
스프링이 관리하는 객체들을 개발자가 원하는 모든곳(메소드)에서 가져와 쓸 수 있는것을 말한다. 
make 메소드의 user나, make2 메소드에서의 user는 같은 user다.
한마디로 싱글톤으로 관리된다. => 스프링이 오브젝트를 스캔하면 user가 딱 한번 힙메모리에 뜨고 그것을 다양한 곳에서 공유해서 쓴다. 

 

한줄 요약

Ioc: 제어의역전, 스프링이 싱글톤으로 빈을 관리하는것
Di: 인스턴스 생성시 IOC 컨터에너에서 싱글톤으로 관리하는 빈들을 변수에 의존성 주입

+ Recent posts