21.03.30


[スプリングフォルダの説明]

new -> spring legacy project
com.spring.main(최상위패키지)
JavaSE1.6으로 쓰면 안되는게 많다(ex. case문)

Spring Legacy Project
- src/main/java <- java소스가 존재(중요)
    - com.spring.main <- 기본 controller가 들어가있음
- src/main/resources <- Spring설정과 관련된 파일이 들어있음
    - META-INF <- ( 신경 X )
    - log4j.xml <- logger와 관련된 설정
- src/test/java <- Junit 테스트 시에 테스트 코드가 작성되는곳 ( 신경 X )
- src/test.resources ( 신경 X )
- src
    -main
- webapp(중요)
    - resources <- css, js, image, html 파일 저장 위치/
    - WEB-INF
        - classes (신경 X)
        - spring
	- appServlet
	    -sevlet-context.xml <- 요청이 들어오면 읽는 설정/
	- root-context.xml <- 서버가 시작되면 읽는 설정(web.xml다음에)/
        - views <- jsp만 보관되는 곳
        (다른파일 들어가도 읽지 못함, servlet-context.xml에서 설정해놓은거 때문에)
        - web.xml <- project 로드시 제일 먼저 읽는 파일/
- test ( 신경 X )
    - target <- 빌드된 파일과 관련있는 내용(개발시 X)/
    pom.xml(중요) <- 빌드시 필요한 설정/

- 서버가 켜졌을 때 순서
Server Run -> web.xml -> root-context.xml -> sevlet-context.xml

- Spring Project 파악시 순서
web.xml -> root-context.xml -> sevlet-context.xml

*원하는 파일을 찾고 싶을때(crtl+shift+R)
*퀵서치(ctrl+shift+(alt)+L)

[スプリングフィーチャー]

1. 제어 역행(I.O.C : Inversion Of Control)
    - 클래스를 빈에 등록해두면 사용자가 아닌 스프링이 제어권을 가지고 있어서 알아서 해준다.
    - 제어역행을 지원하여 필요에 따라 스프링이 사용자 코드를 호출한다.
    - Spring컨테이너에서 필요하다고 판단되면 알아서 동작한다.
2. 의존성주입(D.I : Dependency Injection)
    - 사용할 클래스를 bean에 등록시켜두는것.
    - 특정 클래스에 빈이 중간에 추가 되므로 결합도가 낮아진다.
  	- Class A 가 B 를 직접 호출 하지 않고 Bean 에 등록하여 사용(DI) 함으로써 두 클래스간 
    	  결합도가 낮아진다.
	- 그리고 이 연결은 사용자가 아닌 Spring 이 관리(IOC) 한다.
3. Spring Framework 에서 객체 자원을 효율적으로 관리 해 준다.
4. AOP(Aspect Orient Programming) 을 지원 한다.

[Maven]

- Maven은 빌드 툴이다.
- 빌드툴에는 ant,gadle 등이 있다.
- 빌드툴은 개발된 프로젝트를 동작할수 있는 파일로 만들어주는 기능(java -> jar / Web -> war)
- 원하는 라이브러리를 직접 다운받지 않고 사용할 수 있는 기능
  (실제로는 다운 안받는게 아니라 알아서 다운받는거)
- 이런 설정 들을 pom.xml에서 해준다.
- 기본적으로 사용하는 라이브러리들은 C:/[userPc]/.m2폴더에 저장된다.(변경가능)

[Spring Legacy Project]

[servlet-context.xml]
<!-- @Controller, @RequestMapping등을 인식 할 수 있도록 하는 설정 -->
<annotation-driven />
<!-- css, js, image, 등을 쓰는 경로 지정 -->
<resources mapping="/resources/**" location="/resources/" />
<!-- /resources/image/이미지명.jpg -->
<!-- css는 WEB-INF/views/css 폴더에 넣겠다
<resources mapping="/css/**" location="src/main/WEB-INF/views/css/" />
-->
	 
<!-- home이라고 입력되면 앞에있는 내용과 뒤에있는 내용을 축약해주는 설정 
("home" -> /WEB-INF/views/home.jsp)-->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<beans:property name="prefix" value="/WEB-INF/views/" />
	<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	<!-- 이 패키지 아래에 있는 어노테이션을 인식 하라 -->
	<context:component-scan base-package="com.spring.main" />	
</beans:beans>
[HomeController]
@Controller //이 파일은 컨트롤러라는 뜻(servlet-context.xml에서 설정해줘서 인식가능)
public class HomeController {
	
     //HomeController의 내용을 로그로 찍고 싶다고 설정
     private static final Logger logger=LoggerFactory.getLogger(HomeController.class);

     //"/" 로 GET방식으로 오는놈을 받아줘라, method를 지우면 get이든 post든 다 받는다.
     //그리고 아래 메서드를 실행해라
     @RequestMapping(value = "/", method = RequestMethod.GET)
     public String home(Model model) {
         //로그 찍기(위에서 설정)
         logger.info("메인페이지 요청!!");

         String msg = "안녕하세요 스프링 입니다.";
         //원하는 내용을 담는다. request.setAttribute()의 기능
         model.addAttribute("msg", msg );
         return "home"; //home.jsp로 보내라
     }
}
Spring Service에서 Interface의 장단점
장점
Service에서 죽어도 해당 메서드는 꼭 만들어야 할 경우
대규모 프로젝트에서 유용하다

단점
일반 MVC 패턴처럼 매번 서비스를 객체화를 해야한다.
규격 잡을때는 좋지만 빈번하게 메서드가 추가/삭제/수정될 경우 굉장히 귀찮아진다.
- 서비스도 고쳐야 하고 인터페이스도 고쳐야한다.

어노테이션
@Controller : 해당 클래스가 컨트롤러라고 정의한다.
@Service : 해당 클래스가 서비스라고 정의한다.(안해줘도 되지만 해주는게 좋다.)
@RequestMapping : 요청을 받아들이기 위한 어노테이션
@Autuwired : 해당 서비스를 하나 복사해서 클래스에 고정하며 객체화하지 않는다.
@RequestMapping(value = "/", method = RequestMethod.GET)
- "/" 로 GET 방식으로 오는 놈을 받아주고 아래 메서드를 실행한다.
- POST 방식으로 받을 때 : RequestMethod.POST
- GET과 POST 모두 받아주고 싶다면 method = RequestMethod.GET를 지워주면 된다.