전자정부 프레임웍
Spring Framework 5.3.20 -> 5.3.27
SpringBoot 2.7.12
Eclipse 2022-12
JDK 11
톰캣9
선생님이 주신거 톰캣 잡기
위도우-> 프리퍼런스-> 서버 -> 런타임 인바이러먼트 ->edit -> JRE만 jdk17로 수정
Spring 개괄
컨트롤러에 매핑을 하는거 자체가 1개의 서블렛 클래스 역할을 하는거임
그래서 / 루트컨텍스트로 오는애는 /로 가는거고
/init.do로 호출하면 밑으로 감
Spring Boot 개괄
= 톰캣도 내장톰캣 사용 (서버 필요 x)
전자정부 프레임워크는 Spring Boot 2.7.12 이지만 애초에 그걸 만들 수 없음...
1. 부트는 dependency를 이런식으로 추가하면 됨
2. Boot는 애초에 dependency를 버전을 정해서 가지고 있음 그래서 내맘대로 튜닝이 불가능
3. 프로퍼티스로 주소 앞에 붙을 내용과 뒤에 붙을 내용을 정해줌
Spring framework의 실행 RoadMap
환경
web.xml -> servlet -> DispatcherServlet 클래스 로드 ->
init-param / context-param으로 설정 파일인 spring bean configuration을 읽음 ->
init-param으로 되어있는 servlet-context.xml의 base-package를 읽고 ->
view resolver를 읽음
요청이 들어오면->
base package의 하위 중 @Controller 클래스를 찾음
-> @Controller 클래스 내부에 있는 @RequestMapping의 value와 같은 값을 찾아서 실행
-> 반환된 return값을 Resolver가 재작성해서 /WEB-INF/views/값.jsp WAS요청
-> HTML 반환
Spring Framework 3대 이론
Bean을 만드는 2가지 방법 (xml, annotation)
1.xml
가. xml에 메서드가 있는 클래스를 호출하고 id를 명명해줌
나. main가서 CalssPathXmlApplicationContext로 bean의 경로와
getBean으로 id를 명명해줌
다. 생성자를 주입하지 않으면 기본값 (케냐AA, 1000)이 출력
생성자를 주입하면 주입한 값이 나오지만 index 작성하지 않으면 선언한 순서
index 작성하면 index 대로 나옴 (마지막에 3000의가격? 아라비카로 나온거 확인)
Bean이 new로 클래스 만들던걸 대체한다고 생각하면될거같은데?
2. annotation
◆ Spring Bean Annotation이란???
- 자바 1.5버전부터 지원한다
◆ Spring Framework를 이용하여 구현할 때 Annotation 구문을 사용하기 위해서는 설정이 필수임
첫번째 : CommonAnnotationBeanProcess 클래스를 통해서 Spring Bean Configuration에 <Bean>으로 작성하여 사용 (사용X방법)
두번째 : <context:annotation-driven>을 통해 작업
**세번째(자주씀) : <cotext:component-scan base-package=" "> annotation도 사용할 수 있고 stereoType도 사용할 수 있다.
◆ 4개의 stereotype Annotation
1) @Component : 스테레오 타입의 최상위 객체
2) @Controller : Spring MVC 개발에서 자동으로 Front Controller객체로 인식
3) @Service : 비지니스 로직을 처리함 Transaction 처리 가능함
4) @Repository : DAO
----> 클래스 위에 선언하면 자동으로 Bean으로 생성되고 Spring Container가 관리 함
이걸 자동으로 해주는 애가 <context:component-scan>
org.springframework.stereotype / org.springframework.beans.factory.annotation / javax.annotation
● @Component
패키지 : org.springframework.stereotype
버전 : 2.5
설명 : <bean>을 등록 해줌 -> Spring Container가 사용할 수 있도록 bean객체로 만들어 준다
일반클래스에 @Component로 작성하면 자동으로 클래스가 bean으로 등록
bean 이름(id)은 해당 클래스 명의 Camel Case 방법으로 자동으로 선언됨
Single ton이며 필요시 @Scope를 통해서 사용범위를 선언할 수 있음(근데 쓸일은없겠제?)
● @Controller
● @Service
● @Repository
● @Autowired
패키지 : org.springframework.beans.annotation
버전 : 2.5
설명 : DI(의존관계)
생성된 빈과 빈을 연결할 때 ref 속성을 통해서 연결한다.
생성되어있는 bean을 클래스에 주입하여 사용할 때 설정
사용방법 - 생성자 / 멤버필드 / setter메소드, 일반메소드
"타입" 을 이용한 프로퍼티를 등록 - 검색순서 타입 -> 이름 순 (byType)
해당 타입의 bean이 자동으로 주입되도록 해주는 역할
문제: 해당 객체가 없을 때 or 해당 탑의 객체가 2개 이상 선언된 경우 오류가 발생함
해당객체가 없을 때 발생하는 오류는 -> 필수객체가 아닌 경우에는 @Autowired(required=false)로 선언해서 객체가 null인 상태도 허용시켜서 해결 가능 (기본은 true)
@Resource는 byName으로 되기 떄문에 이름부터 찾음 -> 이 방식으로 @Autowired를 사용한다면
예시 ) @Autowired
@Qualifier("name")// UserDto 타입의 bean중 이름(id)가 name인 bean을 찾아서 주입해 준다
private UserDto dto;
● @Qualifier
패키지 : org.springframework.beans.annotation
버전 : 2.5
설명 : @Autowired가 타입기반이기 때문에 두 개 이상의 타입이 있을 경우 특정 bean을 사용할 수 있도록 선언
● @Resource (Autowired의 Qualifier)
패키지 : javax.annotation
버전 : 2.5
설명 : 어플리케이션에서 필요로 하는 자원을 자동으로 연결하기 위해서 사용
의존하는 bean의 객체를 전달할 때 사용
byName으로 bean연결을 name으로 하게 됨
@Resource(name="name")
Bean과 Bean을 연결하는 방법
메소드명이 property name임 여기서는 setter일거니까 setter의 이름을 카멜방식으로 적어주는 거임
ref를 사용해서 의존적주입 (다른객체의 Bean을 넣기)
JobAddress 안에 EmployeeAddress가 선언되어있을때
EmployeeAddress형태의 Bean을 선언하고 그 Bean의 id myAddr03을
JobAddress Bean에 ref로 호출함
Bean을 호출할 때 (context)
환경을 따로 잡아줘야함
4.3 이후 생성자 주입
장점:
1.순환 참조방지 (계속 새값 들어오는거 방지)
2. 테스트 코드 작성 용이
3. 이상코드 제거
4. 객체 변이 방지 (final)
4.3 이후 생성자 주입 처리 방법
-> 멤버필드를 final로 선언하고 -lombok 생성자 주입을 통해서 한번만 받음
->autowired같은거 안써도 자동으로 값이 들어가서 작동함
서버 이름 (컨텍스트가 다를때) 해결방법
1. 이름 다른거 삭제하고 - > server clean (배포 전 상태로 만들기)
2. pom.xml의 artifactId를 누르고 ctrl + alt + g
3. pom.xml 최상단의 artifcId를 프로젝트 명(배포가 될 이름) 으로 바꾸기 ( 여기선 Spring01_Sample)
4. pom.xml 하단의 build 아래에 finalName을 추가하고 여기도 프로젝트명으로
5. settings -> propertn name - context-root도 패키지 명으로 변경
6. -> 메이븐 업데이트 -> 다시 런온서버로 실행
구디아카데미 후기/ 국비지원IT개발자 취업 / 전민균 강사님