강의를 통해 공부를 할것이다!
공부 목적 : 현재 진행중인 Gavri 프로젝트 로그인등 기능 구현하기 위해 , 이전 팀프로젝트 MVC2 -> Spring 하기위해!
대략적인 시간 12시간 정도 걸리는 상황 일단 오늘 내일 열심히 달려보자 🏃
Node도 배우고싶은데 욕심일까..?
다형성 - 자바에서의 모든 객체는 부모클래스형 참조변수나 구현한 인터페이스 변수에 담을 수 있다.
HelloInterface 를 구현한 HelloCom, HelloKo 두 클래스는 서로 다르지만 하나의 인터페이스를 구현했기때문에 HelloInterface 으로 인스턴스화하여 사용이 가능하다.
2가지 방식이 존재한다
IOC( Inversion of Control) 제어 역전
일반적인 프로그래밍에서는 개발자가 객체를 생성및 관리를 하는데 스프링에서는 스프링 프레임워크 자체가 생성하고 관리를 해주기 때문에 제어역전 IOC 컨테이너라 부른다.
자바 모델이나 기능, 프레임워크등에 따르지 않고 홀로 독립적이며 단순한 기능만을 가진 객체를 의미 Java에선 이러한 객체들을 Bean이라고 부른다.
Bean 객체란? 개발자가 만든 설정파일로 스프링이 만든 객체
속성
class
: 객체를 생성하기 위해 사용할 클래스
id
: 객체를 가져오기 위해 사용하는 이름
lazy-init
: 싱글톤인 경우 xml로딩할때 객체 생성여부 지정 , true(로딩시 생성하지 않음)
scope
: singleton = 객체를 하나만 생성할때 사용,prototype = 객체를 가져올 때마다 객체를 생성
init-method
: 생성자 호출 이후 자동으로 호출 (해당 메소드가 없을 경우 에러)
destroy-method
: 객체가 소멸될 때 호출 (해당 메소드가 없을 경우 에러)
상위 Beans 태그에 지정가능한 속성
default-init-method
: init-method를 설정하지 않은 경우 자동호출 (해당 메소드가 없을 경우 정상작동)
default-destory-method
: destroy-method를 설정하지 않은 경우 자동호출 (해당 메소드가 없을 경우 정상작동)
생명주기
Bean 정의할 때 BeanPostProcesson 인터페이스를 구현한 클래스를 정의하면 Bean객체를 생성할 때 호출될 init 메서드 호출을 가로채 다른 메서드를 호출할 수 있도록 구현가능
ex) <bean class="package.BeanPostProcesson 인터페이스를 구현한 클래스"/>
오버라이딩 할 메소드 두개
해당 빈에서 생성자를 여러 형태로 만들고
xml 정의한 빈 객체 사이에
<constructor-arg value='value' type='타입' index='주입순서' ref='참조할 빈의 이름'/>
property 태그 setter 메서드를 이용한 주입
value에 지정한 값은 문자열,실수,정수 우선으로 들어간다. 만약 오버라이딩한 경우 type을 지정하여 오류를 방지하자.
<property name="data1" value="100" />
ㄴ> public void setData1(ini data1){ this.data1 = data1 } ;
컬렉션 타입 주입
<property name="list1">
<list>
<value>문자열1</value>
<value>문자열2</value>
<value>문자열3</value>
</list>
</property>
제네릭이 Set으로 되어있다면?
스프링에선 Set 에 Bean 객체를 집어넣을때 같은 이름의 빈을 여러개 주입하면 단 한개의 객체로 인식한다(프로토타입일지언정)
제네릭이 Map으로 되어있다면?
제네릭이 Property으로 되어있다면?
자동 주입은 이름 타입 생성자를 통해 가능하다.
이름을 통한 주입
autowire="byname"
지정후 Setter 메소드와 같은 이름(id)인 Bean객체가 존재할경우 자동주입이 된다.
타입을 통한 주입
autowire="byType"
지정후 타입이 일치할경우 자동주입된다.
동일한 타입의 빈이 두 개 이상 정의되어 있으면 오류가 발생한다. 아래 예제는 오류발생
생성자를 통한 주입
autowire="constructor"
생성자의 매개 변수 타입과 정의된 빈의 타입이 일치할 경우 주입된다. 타입처럼 동일한 빈이 두개이상 존재할경우 에러가 발생한다.
xml파일 내에서 default-autowire지정
beans 태그 내에 default-autowire="byName,byType,contructor" 지정가능
만약 bean태그에 autowire 값 지정시 default 값 무시
default-autowire에 영향을 받지 않기 위해선 autowire="no" 입력
xml파일 처럼 이 클래스가 현재 자바 파일이 빈 등록을 위한 자바 파일임을 알려주는 기능
@Configuration
public class BeanConfigClass{...}
Spring Context 생성
xml로 설정시
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("경로");
애노테이션 설정시
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("해당자바클래스");
ctx.register(BeanConfig.class);
ctx.refresh();
빈객체를 정의할때 사용
메서드의 이름이 bean 의 이름이 된다.
@Bean(name=이름)
@Lazy : lazy-init 속성을 지정
@Scope : Scope지정
@Primary : Primary 속성 지정 // 똑같은 빈 객체가 여러개 존재할때 이 속성을 지정시 지정한 빈 객체만 호출됨.
@Bean(name="java200")
@Lazy
@Scope("prototype")
@Primary
public TestBean1 java1() {
TestBean1 t1 = new TestBean1();
return t1;
}
@Configuration
public class BeanConfigClass{
@Bean(initMethod="init" destroyMethod="destroy")
public TestBean1 Test1(){
return new TestBean1();
}
public class TestBean1 {
public TestBean1(){
sysOut("Test1 생성자")
}
public void init(){ sysOut("test1 init") }
public void destroy(){ sysOut("test1 destroy") }
deprecated 자동주입보다 빈 객체에 직접 주입하는 것을 추천하고 있다.
주입방식 : Autowire.BY_NAME, Autowire.BY_TYPE
deprecated 반드시 주입해야할 프로퍼티는 생성자 주입을 이용하도록 변경되었다.
반드시 주입해야할 프로퍼티로 설정한다.
객체 타입을 통해 Bean 객체를 자동으로 주입한다.
@Autowired(required = false) 값을 지정해줄경우 있으면 주입 없으면 아무일이 벌어지지 않는다.
@Autowired 로 주입 시 같은 타입의 Bean이 여러개로 정의되어 있다면 @Qualifier("해당빈이름") 으로 지정할수 있다.
@Value(값) 을 통해 생성자에서 값 지정이 가능하다.
스프링에서 기본으로 제공되지는 않지만 자바 플랫폼 공통 어노테이션이다.
적용을 위해서는 반드시 라이브러리 추가가 필요하다.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
@Bean(initMethod=...) 이렇게 설정하는것도 좋지만 타이핑 중에 문제도 생길 가능성이 높으니 빈객체 내에서 init메서드 ,destroy 메서드 지정
변수이름과 동일한 이름의 Bean이 주입된다.
기존 사용방식 @Autowired @Qualifier("이름")
현재 사용방식 @Resource , @Resource("이름지정")
컴포넌트란? 리액트에서 많이 경험해보았듯이 독립적인 단위 모듈을 뜻한다.
@Component("id") id는 선택값 //의 경우 빈 객체로 만들 클래스 상단에 표기 후
@Configuration 이 적혀있는 설정 클래스에서
@ComponentScan(basePackages = {"경로1","경로2"}) 로 지정시 작동
XML
<context:component-scan base-package="경로"/>
aspectj 메이븐 의존주입 설정
Beans 설정
사용 방식 XML
모든 method1이라는 메소드를 관심사로 지정한것.
`<aop:before method="사용할 메소드명" pointcut-ref="해당 포인트컷지정"
Joint Point - around
around의 경우 전후에서 Advice를 실행한다고 하였는데 전후 실행이라는 것이 애매모호하다.
그렇기 때문에 원래 메서드를 pjp 객체에 담은 상태로 어떠한 동작 이후에 작동할지를 지정할수 있다.
Execution 명시자
`expression="execution(void kr.co.gavri.beans.TestBean1.method1())"
kr.co.gavri.beans.TestBean1 클래스의 public void method1() 를 타깃으로 지정
XML
@Annotation
Advice
지원 어노테이션
스프링 프레임워크는 JDBC 프로그래밍을 위해 JdbcTemplate 클래스를 제공하고 있습니다.
maven -> Spring JDBC 검색 후 추가
MySql등 db 연결할려면 또다른 라이브러리가 필요함.
DBCP? 모하는 놈이고
select 문을 데이터를 가져올때 어떤 컬럼의 값을 bean 어디에 주입할 것인지 결정을 해줘야 하는데 이 역할을 하는 클래스를 Mapper 클래스 라고 부른다.
사용
delete 또한 query 메소드를 이용해서 사용하면 된다.