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를 지워주면 된다.
Reference
この問題について(21.03.30), 我々は、より多くの情報をここで見つけました https://velog.io/@mingmang17/21.03.30テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol