Spring 공부!

Gavri·2021년 8월 17일
0

Spring 공부 📄


강의를 통해 공부를 할것이다!

공부 목적 : 현재 진행중인 Gavri 프로젝트 로그인등 기능 구현하기 위해 , 이전 팀프로젝트 MVC2 -> Spring 하기위해!

대략적인 시간 12시간 정도 걸리는 상황 일단 오늘 내일 열심히 달려보자 🏃

Node도 배우고싶은데 욕심일까..?

의문점 ❓

공부내용 정리 🚩

XML을 이용한 Spring Bean객체 생성 및 개념

다형성

다형성 - 자바에서의 모든 객체는 부모클래스형 참조변수나 구현한 인터페이스 변수에 담을 수 있다.
HelloInterface 를 구현한 HelloCom, HelloKo 두 클래스는 서로 다르지만 하나의 인터페이스를 구현했기때문에 HelloInterface 으로 인스턴스화하여 사용이 가능하다.

Spring 프레임워크 설정 방식

2가지 방식이 존재한다

  • xml을 통한 방식
  • 어노테이션을 이용한 방식

IOC 컨테이너

IOC( Inversion of Control) 제어 역전
일반적인 프로그래밍에서는 개발자가 객체를 생성및 관리를 하는데 스프링에서는 스프링 프레임워크 자체가 생성하고 관리를 해주기 때문에 제어역전 IOC 컨테이너라 부른다.

POJO(Plain Old Java Object)

자바 모델이나 기능, 프레임워크등에 따르지 않고 홀로 독립적이며 단순한 기능만을 가진 객체를 의미 Java에선 이러한 객체들을 Bean이라고 부른다.

ApplicationContext

  • 클래스를 통해 객체를 생성하고 이를 전달한다.
  • 상속 등 객체간의 관계를 형성하고 관리한다.
  • 국제화 지원 등 문자열에 관련된 다양한 기능을 제공한다.
  • 리스너로 등록되어 있는 Bean에 이벤트를 발생시킬 수 있다.
  • Bean에 관련된 설정을 위한 xml 파일을 즉시 로딩하면서 객체를 미리 생성해서 가지고있다.

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를 설정하지 않은 경우 자동호출 (해당 메소드가 없을 경우 정상작동)

생명주기

  • IoC 컨테이너가 종료 될때 객체가 소멸된다. Ex)ctx.close();

BeanPostProcessor

Bean 정의할 때 BeanPostProcesson 인터페이스를 구현한 클래스를 정의하면 Bean객체를 생성할 때 호출될 init 메서드 호출을 가로채 다른 메서드를 호출할 수 있도록 구현가능
ex) <bean class="package.BeanPostProcesson 인터페이스를 구현한 클래스"/>

오버라이딩 할 메소드 두개

  • postProcessBeforeInitalization : init-method에 지정된 메소드가 호출 되기전에 호출됨 리턴값은 Bean객체
  • postProcessAfterInitalization : init-method에 지정된 메소드 호출 이후 호출 리턴값은 Bean객체
  • 주의사항) init-method가 지정되어 있지 않더라도 자동 호출

DI(의존성주입 ,Dependency Injection)

  • Bean 객체를 생성할 때 Bean객체가 관리할 값이나 객체를 주입하는 것을 의미
  • Bean 객체 생성 후 Bean 객체가 가질 기본 값을 자바 코드로 설정하는 것이 아닌 Bean을 정의하는 xml코드에서 정의하는 개념

해당 빈에서 생성자를 여러 형태로 만들고
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으로 되어있다면?

auto wire 자동주입

자동 주입은 이름 타입 생성자를 통해 가능하다.

이름을 통한 주입
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" 입력

애노테이션을 이용한 Spring 개발

@Configuration

xml파일 처럼 이 클래스가 현재 자바 파일이 빈 등록을 위한 자바 파일임을 알려주는 기능

@Configuration 
public class BeanConfigClass{...}

Spring Context 생성

xml로 설정시
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("경로");

애노테이션 설정시
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("해당자바클래스");
ctx.register(BeanConfig.class);
ctx.refresh();

@Bean

빈객체를 정의할때 사용
메서드의 이름이 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;
    }

@Bean(initMethod ... , destroyMethod ...)


@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")		}
       	 

@Bean(autowire = 주입방식) 자동주입 -deprecated

deprecated 자동주입보다 빈 객체에 직접 주입하는 것을 추천하고 있다.
주입방식 : Autowire.BY_NAME, Autowire.BY_TYPE

@Required -deprecated

deprecated 반드시 주입해야할 프로퍼티는 생성자 주입을 이용하도록 변경되었다.
반드시 주입해야할 프로퍼티로 설정한다.

객체 주입 애노테이션

@Autowired

객체 타입을 통해 Bean 객체를 자동으로 주입한다.

@Autowired(required = false) 값을 지정해줄경우 있으면 주입 없으면 아무일이 벌어지지 않는다.

@Qualifier

@Autowired 로 주입 시 같은 타입의 Bean이 여러개로 정의되어 있다면 @Qualifier("해당빈이름") 으로 지정할수 있다.

@Value

@Value(값) 을 통해 생성자에서 값 지정이 가능하다.

JSR-250 어노테이션

스프링에서 기본으로 제공되지는 않지만 자바 플랫폼 공통 어노테이션이다.
적용을 위해서는 반드시 라이브러리 추가가 필요하다.

	<dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.3.2</version>
</dependency>

@postConstructor,@preDestroy


@Bean(initMethod=...) 이렇게 설정하는것도 좋지만 타이핑 중에 문제도 생길 가능성이 높으니 빈객체 내에서 init메서드 ,destroy 메서드 지정

@Resource


변수이름과 동일한 이름의 Bean이 주입된다.
기존 사용방식 @Autowired @Qualifier("이름")
현재 사용방식 @Resource , @Resource("이름지정")

Component

컴포넌트란? 리액트에서 많이 경험해보았듯이 독립적인 단위 모듈을 뜻한다.

Component 지정방식

@Component("id") id는 선택값 //의 경우 빈 객체로 만들 클래스 상단에 표기 후

@Configuration 이 적혀있는 설정 클래스에서
@ComponentScan(basePackages = {"경로1","경로2"}) 로 지정시 작동

XML
<context:component-scan base-package="경로"/>

AOP

  • Aspect Oriented Programming 약자로 관점 지향 프로그래밍
  • 관점 지향 : 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다 는 것이다.
  • 로깅, 감사, 선언전 트랜잭션, 보안, 캐싱 등 다양한 곳에서 사용된다

AOP 용어

  • Joint Point : 모듈이 삽입되어 동작하게 되는 특정 위치
  • Point Cut : 다양한 Joint Point 중에 어떤 것을 사용하지 선택
  • Advice : Joint Point에 삽입되어 동작할 수 있는 코드
  • Weaving : Advice를 핵심 로직 코드에 적용하는 것
  • Aspect: Point Cut + Advice

AOP Advice 종류

  • before: 메서드 호출전 동작하는 advice
  • after-returning : 예외 없이 호출된 메서드의 동작이 완료되면 동작하는 Advice
  • after-throwing : 호출된 메서드 동작중 예외가 발생했을 때 동작하는 Advice
  • after : 예외 발생 여부에 관계없이 호출된 메서드의 동작이 완료되면 동작하는 Advice
  • around : 메서드 호출 전후로 동작하는 Advice

사전 설정

aspectj 메이븐 의존주입 설정

Beans 설정

사용 방식 XML

모든 method1이라는 메소드를 관심사로 지정한것.
`<aop:before method="사용할 메소드명" pointcut-ref="해당 포인트컷지정"

Joint Point - around
around의 경우 전후에서 Advice를 실행한다고 하였는데 전후 실행이라는 것이 애매모호하다.
그렇기 때문에 원래 메서드를 pjp 객체에 담은 상태로 어떠한 동작 이후에 작동할지를 지정할수 있다.

Execution 명시자

  • PointCut을 지정할 때 사용하는 문법
  • execution(접근제한자 리턴타입 클래스이름 메서드이름(매개변수))
  • 접근제한자 : public만 지원된다.
  • 리턴타입 : 메서드의 매개변수 타입
  • 클래스 이름 : 패키지를 포함한 클래스 이름
  • 메서드 이름 : 메서드의 이름
  • 매개변수 : 매개변수의 형태
    • : 하나의 모든 것을 의미한다
  • .. : 개수 상관없이 모든 것을 의미한다.

`expression="execution(void kr.co.gavri.beans.TestBean1.method1())"
kr.co.gavri.beans.TestBean1 클래스의 public void method1() 를 타깃으로 지정

@AspectJ 어노테이션

XML

@Annotation

Advice

지원 어노테이션

  • @Before,@After,@Around,@AfterReturning,@AfterThrowing
  • 위 어노테이션 ("execution 명시자 사용")

스프링 JDBC

스프링 프레임워크는 JDBC 프로그래밍을 위해 JdbcTemplate 클래스를 제공하고 있습니다.

maven -> Spring JDBC 검색 후 추가
MySql등 db 연결할려면 또다른 라이브러리가 필요함.
DBCP? 모하는 놈이고

DB 연결 빈 객체 설정

DAO 만들기

Mapper 클래스

select 문을 데이터를 가져올때 어떤 컬럼의 값을 bean 어디에 주입할 것인지 결정을 해줘야 하는데 이 역할을 하는 클래스를 Mapper 클래스 라고 부른다.

사용

delete 또한 query 메소드를 이용해서 사용하면 된다.

MyBatis

라이브러리 추가

설정 빈 추가

Mapper 추가

Mapper 인터페이스 구현


발생한 에러 💢

profile
모든건 기록으로

0개의 댓글