-
Thu/Feb/20 [Java/Spring] Day36. Spring 기초Study/2020 국비교육_Java 2020. 2. 20. 09:48
Thu/Feb/20 [Java/Spring]
Day36. Spring 기초
Spring Framwork
Spring은 일반적으로 알고 있는 것과 달리, 웹 뿐만 아니라 순수 Java에서도 사용된다
Spring 하나만으로도 2년 이상 배워야 할 것들이 많다, Java Web을 잘하고 싶으면 Spring은 필수적으로 잘해야 함
JEE가 제공하는 기능 외 DI / AOP 등 기능 지원
주요 특징
-
경량의 프레임워크 : EJB → Spring
-
Java 객체 담고 있는 container
-
Java 객체의 life cycle 관리 해줌
-
MVC framework 제공 : 모델2 기반/흐름
-
DI dependency Injection 의존성 관계 패턴 지원
-
설정 파일(.xml)을 통해 의존관계 설정
-
JSTL의 useBean과 유사
-
의존성 주입 = IoC Inversion of Control 제어역행
-
xml에서 만들어진 객체를 Java에서 사용, 이 객체에 대한 컨트롤을 Java에서
-
.xml 또는 annotation (ex. @WebServlet) 을 이용하여 객체 간 의존관계 설정
-
기존에 객체 생성 방식 : ClassExe exe = new ClassExe();
-
Spring에서는 xml 설정을 통해 이러한 객체 생성 필요 없이 바로 사용 가능; Model Class 활용을 위해 했던 객체 생성 - getter - setter 모두 안써도 됨
-
→ Java코드 최소화! 작업속도도 빨라짐, 다만 Spring에 적응하기까지 시간이 오래걸리는 것
-
-
Interface 의존성 낮춤
-
의존성 높음 = B class method 이름이 바뀔 때 B method를 사용하는 A Class의 method의 이름도 바뀌는 것 ; 하나가 바뀌면 전부를 바꾸어야
-
의존성 낮춤 = Interface 사용을 통해 이렇게 결합도 높은 코드에서 결합도 낮은 코드로, 코드 변경없이 xml 설정 변경만으로 변경 가능
-
Spring, 특히 DAO 부분에서 Interface 사용은 필수!!
-
-
-
AOP Aspect Oriented Programming 관점지향 프로그래밍 지원 ; 공통 관심 모듈 관리
-
트랙잭션, 로깅, 보안 등 공통으로 필요로 하는 기능 분리하여 각각의 모듈에 적용
-
DAO 관점 : 예를 들어 게시판에서 목록화면/글쓰기 화면/상세보기화면/수정화면에서 공통으로 사용하는 DBconnection을 method로 분리하여 관리한 것
-
-
POJO Plain Old Java Objects 지원 : 웹 상에서 작업
-
특정 인터페이스/클래스를 상속받지 않은 자바 객체를 스프링 컨테이너가 저장
-
-
트랜잭션 처리 위한 일관된 방법 제공
-
하나의 과정에서 중간에 오류가 나면 그 과정 전체를 취소처리 (초기화)
-
Oracle에서 commit 하기 전까지는 저장되지 않는 기능
-
try-catch와는 다른 개념, 주로 DB에서 사용
-
-
영속성 persistent 과 관련된 다양한 api 제공
-
MyBatis (DB), Hibernate (DB, 기능은 가장 뛰어나지만 무거워서 잘 쓰이게 됨), JPA 등
-
지금까지 나온 framwork 중에서 가장 호환성 좋음
-
* 스프링의 다양한 모듈 구조
AOP / ORM / DAO / WEB / Context / Core / MVC : 각각이 MVC 구조로 되어 있고 모두가 모여서 또 하나의 MVC 모델이 됨
대부분 교육과정에서 Spring MVC 정도만 교육 (시간 문제..) - 웹 개발자는 2년 내로 반드시 Spring 정복하여 해체 - 수정 할 수 있는 능력 길러야 함
Bean 생성 및 사용
설정파일.xml에 <bean> 사용하여 id, class 지정
SYNTAX
설정파일.xml
<beans> <bean id = "클래스 객체 명" class = "팩키지.클래스"> <constructor-arg value = "생성자에 던질 값1"></constructor-arg> <constructor-arg value = "생성자에 던질 값2"></constructor-arg> .... <constructor-arg value = "생성자에 던질 값n"></constructor-arg> </bean> </beans>
<constructor-arg> : 생성자의 parameter 갯수에 따라
-
생성자를 통해 빈 객체를 주입/전달받는 경우 <constructor-arg ref="..." /> 사용
-
기본데이터/String 타입인 경우 <constructor-arg value = "..." />
-
또는 <constructor-arg><value>"값"</value></constructor-arg>사용
-
value로 전달될 경우 기본적으로 String type으로 처리
-
value type 지정할 경우 : <constructor-arg><value type="TYPE">"VALUE"</value></constructor-arg>
-
생성자 갯수가 여러개면 그만큼 <bean>을 만들어주면 된다
xml은 TEXT파일이지만 html 같은 구조를 갖고 있어, 여는 태그-닫는 태그 반드시 써야함
자바 클래스.java
ApplicationContext context = new FileSystemXmlApplicationContext("xml파일 경로"); 클래스명 객체명 = (클래스) context.getBean("지정객체명")
ApplicationContext 객체를 통해 getBean으로 클래스 선언하여 사용
스프링 빈을 생성할 때 특별한 설정 없으면 기본 생성자 이용하여 객체 생성
; 각 클래스에서 기본 생성자 반드시 필요한 이유
가장 많이 사용하는 패턴인 싱글턴 패턴 클래스의 경우 등
생성자에 접근할 수 없는 경우는 <bean>에서 factory-method 속성값으로 static 지정하여 빈 생성
SYNTAX
<bean id = "객체명" class = "팩키지.클래스" factory-method = "method이름"> </bean>
factory-method에서 ()쓰지 않고 이름만 쓴다
private 변수 사용하는 방법 <property>
반드시 private 변수에 대한 setter가 준비되어 있어야 함
SYNTAX
<bean id="AAA" class="팩키지.클래스A"> </bean> <bean id = "BBB" class="팩키지.클래스B"> <property name="PRIVATE변수명" ref="AAA" /> </bead>
클래스 A에 대한 객체 AAA 생성
클래스 B에 대한 객체 BBB 생성하고,
클래스B 안에서 private 변수로 선언된 클래스 A 객체를 사용하기 위해 property를 통해 자동으로 setter 작업하여
private 변수로 선언된 이름으로 사용
Spring MVC 흐름
반드시 외워야 어디서 오류가 나는지 파악할 수 있다!
-
WebBrowser → 요청 → DispatcherServlet
-
→ 컨트롤러 요청 → HandlerMapping
-
→ 처리 Controller return → DispatcherServlet
-
→ 처리요청 → Controller
-
→ ModelAndView return → DispatcherServlet
-
→ View 객체 요청 → viewResolver
-
→ View return → DispatcherServlet
-
→ 응답생성 요청 → View
-
→ JSP 생성 → WebBrowser
-
DispatcherServlet = 최초 요청부터 마지막 응답까지 모든 것을 Controll하는 controll tower; web.xml
-
HandlerMapping = 실제 작업 수행하는 controllers 관리
-
Controller = controller interface 구현 받아 내부에서 작업 수행, 필요한 JSP와 값을 return
-
ViewResolver = View 인스턴스 return
-
View = JSP파일들
대부분 interface로 구현하기 때문에, DAO 말고는 실제 코딩량이 많지 않음 (각 10줄 이내)
예제) Spring BOARD
프로젝트 파일 : https://github.com/ezerwi/lecture0220_spring
초기 파일 세팅
<web.xml> 수정
-
<web-app> : Tomcat이 해석할 수 있는 내용
-
xmlns : xml name space
-
-
servlet 내용
-
<servlet></servlet>
-
<servlet-name>서블릿 네임</servlet-name>
-
<servlet-class>클래스의 풀네임 </servlet-class> ; DispatcherServlet 객체 생성
-
-
<servlet-mapping> </servlet-mapping>
-
<sevlet-name>위의 서블릿 네임과 동일하게</servlet-name>
-
<url-pattern>URL패턴</url-pattern>
-
-
-
<welcome-file-list> 프로젝트명으로 접속시 첫 페이지
하나의 프로젝트에는 반드시 하나의 web.xml만 있어야 함
프로그램 시작시 반드시 web.xml 부터 작성시작하고 저장하고 닫기!
<Context.xml> 수정
전체 application의 환경 설정
<Context> </Context>
-
<Resource></Resource> 사용할 자원 설정
-
name ; DAO에서 context.lookup으로 찾을 수 있는 이름 (=="java:comp/env/"+name)
-
env = environment
-
-
auth
-
type : class로 type 설정
-
username
-
password
-
driverClassName
-
factory ; datasource 만들어 주는 곳
-
url
-
maxActive ; 최대연결 - 관례상 최소 20
-
maxIdle ; 동시 접속 수
-
지난번 Oracle-JDBC 접속때와는 다르게 Spring 전용 Resource 코드 사용
; DAO에서 Context 객체 생성해 사용
<Resource name="jdbc/orcl" auth="container" type="javax.sql.DataSource" factory="org.apache.commons.dbcp.BasicDataSourceFactory" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:XE" username="lect0220" password="1234" maxActive="20" maxIdle="10" > </Resource>
<board-servlet.xml>
https://github.com/ezerwi/board-servlet-xml/blob/master/board-servlet.xml
불러오는 중입니다... 각 Controller 안에 setter 없으면 무조건 에러!
setter를 미리 넣든지, 아니면 나중에 추가하든지!
list.jsp까지
'Study > 2020 국비교육_Java' 카테고리의 다른 글
Mon/Feb/24 [Java/Spring/myBatis] Day38. myBatis 활용 게시판 (0) 2020.02.24 Fri/Feb/21 [Java/Spring] Day37. Spring 기초(2) (0) 2020.02.21 Wed/Feb/19 [Java/JSP] Day35-1. FileUpload 실습_입사지원서 페이지 (0) 2020.02.19 Wed/Feb/19 [Java/JSP] Day35. FileUpload (0) 2020.02.19 Tue/Feb/18 [Java-Oracle] Day34-2. DBCP 데이터베이스 커넥션 풀 (0) 2020.02.18 -