ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 흐름

    반드시 외워야 어디서 오류가 나는지 파악할 수 있다!

    1. WebBrowser → 요청 → DispatcherServlet

    2. → 컨트롤러 요청  → HandlerMapping

    3. → 처리 Controller return → DispatcherServlet

    4. → 처리요청 → Controller

    5. → ModelAndView return → DispatcherServlet

    6. → View 객체 요청  → viewResolver

    7. → View return  → DispatcherServlet

    8.  → 응답생성 요청  → View

    9.  → 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까지

    댓글

Designed by Tistory.