2023. 6. 14. 20:38ㆍTIL(Today I Learned)
//스프링 경로설정방법
//Controller어노테이션 추가
//메소드에 RequestMapping추가하여 결로 설정
//return 부분에는 jsp 경로 추가
@Controller
public class MemberController {
@RequestMapping("member/join")
public String m01() {
return "member/join";
}
}
1. 요청받기
기존 servlet에서는 클래스에 @WebSerlvet("~")을 붙였다면
스프링에서는 메소드에 @RequestMapping("")을 붙임
각각 클래스를 매번 생성했어야 했음
메소드에 annotation을 추가해야 해서 굳이 servlet에서 처럼 MemberLoginController, MemberJoinController, MemberEditController같이 클래스를 따로따로 만들 필요가 없음.
그냥 MemberController하나만 만들어주고 여러개의 메소드를 추가해서 처리할 수 있음.
2. 포워딩
기존에는 req.getRequestDispatcher.forward("")를 사용했다면
기존에는 포워딩을 하고나서 메소드가 끝나는게 아니라 포워딩은 포워딩대로 하고 다음 코드로 실행되버림.
실수로 다른 코드를 입력해버리면 그 코드가 실행되어버림.
포워딩 이후에도 메소드가 동작하는 문제가 있었는데 스프링에서는 return ""; 사용
개발자한테도 직관적으로 코드를 사용할 수 있음.
포워딩 안의 문자열은 관습적으로 "/WEB-INF/views/~~~"이렇게 썼었음.
더이상 매번 사용하던 문자열을 더 이상 쓸 필요가 없음.
리턴값에다 "login"이렇게만 쳐주면 login.jsp로 자동으로 가버림.
3. 리다이렉트
기존 서블릿에서는 resp.sendRedirect를 사용했지만
스프링에서는 return ""이렇게 사용가능.
포워딩과 다른 점은 앞에 "redirect:~"이렇게 써주면 됨.
기존 서블릿에서는 최상단 경로를 가져와서 써야 했지만
스프링에서는 그럴 필요 없이 "redirect:"이렇게만 써주면 자동으로 최상단 경로를 추가해줌.
(2) 스프링에서 get, post 방식 설정하기
package com.kh.app.member.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MemberController {
//회원가입(화면), get일 때만 활동
@RequestMapping(value = "member/join", method=RequestMethod.GET)
public String m01() {
return "member/join";
}
//회원가입 값 처리, post일 때만 활동
}
(3) RequestMapping보다 더 편한게 있다. 바로 GetMapping이다.
Requestmapping은 servlet의 service와 비슷한 것이다. 이에 맞춰 쓸 수 있도록 method=RequestMethod.GET을 지정해서
사용할 수 있는데
이것보다 훨씬 편한 것이 바로 GetMapping이다. GetMapping뿐만 아니라 PostMapping도 있고 여러가지가 있다.
자동으로 get인지 post인지에 따라 받아온다.
작업이 매번 반복되니까 그걸 해결하기 위해 return "member/join"이렇게 쓰면 xml파일에서 자동으로 경로를 붙여준다.
기존에 servlet에서는 req.getRequestDispatcher()를 작성했는데 스프링에서는 beans로 다 설정이 되어 있다 보니 member/join이런 식으로만 붙여줘도 알아서 WEB-INF/views/이 부분을 붙여준다.
이것이 바로 viewResolver다.
viewResolver는 servlet-context.xml 파일에 설정되어 있다.
beans 태그의 value를 따로 설정해주면 된다.
viewResolver가 알아서 포워딩을 해주는데 받은 문자열의 redirect라는 문자가 포함되어 있으면 포워딩하라는게 아니라 리다이렉트하라고 인식한다.
그래서 resp.sendRedirect를 수행한다.
(4) 값을 받는 방법
- 스프링에서는 request에서 command객체를 자동으로 설정해준다.
- 그래서 MemberVo라는 파라미터를 넣어도 알아서 req.getParameter가 되고 데이터 뭉치기 setId 이런 것도 알아서 설정이 되도록 동작이 된다.
@PostMapping("member/join")
public String m02(MemberVo vo) {
//데꺼
//데뭉
System.out.println(vo);
//서비스
System.out.println("회원가입 진행");
//결과
return "redirect:/";
}
@RequestParam String id, @RequestParam String pwd, @RequestParam(required = true), defaultValue = "닉네임을 설정해주세요") String nick
- 이렇게 값이 null일 경우, defaultValue를 따로 설정해줄 수 있다.
- required가 true일 경우 값이 무조건 들어 있어야 한다.
(5) 정리
1. 컨트롤러에서는 req, resp 받기가 가능하다.
2. 파라미터는 @Requestparam으로 설정한다.
3. 커맨드객체는 @ModelAttribute로 데이터를 꺼내고 뭉칠수 있다.
배열 형태로 변수를 만들어주면 한번에 받아오는 것도 가능하다.
(6) maven
- maven은 빌드하는 것을 도와주는 도구이다.
- 그런 과정을 maven을 이용해서 빌드를 하게 된다.
- maven의 주요 역할 중 하나는 library 파일을 관리해준다.
(7) pom.xml이란?
- pom은 project object model을 뜻한다.
- maven에서 jstl 라이브러리는 인식이 잘 안 된다.(sts에서 하면 잘 안되는 문제가 ㅠㅠ, 인텔리제이에서는 잘됨)
- jstl라이브러리는 수동으로 직접 추가해야 한다.
<?xml version="1.0" encoding="UTF-8"?>
//project태그는 현재 xml문서는 project 태그를 작성하는 그런 파일을 뜻한다.
//project 태그 안에는 xmlns, xsi가 포함되어 있다.
//xmlnamespace라고 해서 namespace에 대한 정보, schema(인증 정보), 인증 파일이 위치한 정보가 작성되어 있다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
//modelVersion, groudId, artifactId, name, packaging, war, version 은 현재 프로젝트에 대한 정보를 나타낸다.
//artifact -> 내가 만든 app의 이름을 뜻함.
//jar는 java archive file을 뜻하고, war는 web archive file을 뜻한다.
<modelVersion>4.0.0</modelVersion>
<groupId>com.kh</groupId>
<artifactId>app</artifactId>
<name>springPrj03</name>
<packaging>war</packaging>
//version : 아직 초기버전(1.0.0)이고 임시버전(SNAPSHOT)임을 뜻함
<version>1.0.0-BUILD-SNAPSHOT</version>
//properties -> 변수를 말함
//properties안쪽에는 변수를 만들 수 있다. 자바에서 보자면 x = 10은 <x>10</x>과 같다.
//여러가지 같은 값이 설정되어 있을 때는 변수로 하나로 설정해서 관리하면 편하기 때문에 사용함.
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
//dependencies : lib관련 태그
//외부 라이브러리 파일을 갖다 쓸건데 그걸 dependencies로 사용할 수 있음.
//dependency 태그 하나 만들고, groupId, artifactId, version을 써주면 됨.
//그렇게 하면 알아서 라이브러리가 다운로드되는데, 그 경로를 설정해주면 알아서 컴퓨터에서 다운로드받음.
//스프링 mvc 템플릿을 이용하면 이에 관련된 라이브러리가 기본적으로 다 세팅이 됨.
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
(8) web.xml이란?
- web.xml은 servlet 에서도 있었다.
- 현재 프로젝트가 웹에 관련된 것이라 필요한 것이다.
- servlet에 mapping 정보와 같은 웹에 관련된 정보를 web.xml에서 할 수 있다.
- 톰캣 안에서 서블릿들이 여러개 있을 때, 그에 관한 filter, mapping을 설정하는 것이 web.xml이다.
- 지금 만드는 프로젝트는 여전히 웹프로젝트가 맞다. 당연히 sts에서도 web.xml에 관련된 것을 설정할 수 있다.
- 어노테이션 가지고 하는 것은 나중에 등장한 것이지 기본은 web.xml에 하는 것이었다.
(9) root-context.xml과 servlet-context.xml이란?
- 스프링과 관련된 설정을 할 때는 이 두가지의 xml을 활용한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
&&&집가면 할일&&&
1. dev 아래에 maven 파일을 만들어준다.
2. maven 파일 아래에 mavenLib 파일을 만든다.
3. sts의 window -> preferences -> maven을 검색.
4. 검색하면 User Settings에 들어간다.
5. 메모장을 열어
<?xml version="1.0"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/SETTINGS/1.0.0">
<localRepository>D:\dev\mvn\mvnLib</localRepository>
</settings>
</settings>
이걸 붙이고 저장한다.
6. 저장할 때 이름은 dev > mvn 폴더에 settings.xml로 저장한다.(파일 형식은 모든 파일)
7. 그리고 userSettings 에서 방금 만든 settings.xml 경로로 설정해준다. 그러면 자동으로 Locatl Repository 값도 변경된다.
8. 그렇게 Apply를 누르고 난 후에 프로젝트 오른쪽 클릭해서 maven을 클릭한다. 그 다음에 해당 프로젝트를 선택한 후에 ok를 눌러주면 자동으로 library 파일들이 다운로드 된다.
'TIL(Today I Learned)' 카테고리의 다른 글
2023.06.19 TIL (0) | 2023.06.19 |
---|---|
2023.06.15 TIL(web.xml, root-context.xml, servlet-context.xml 상세 설명) (0) | 2023.06.15 |
2023.06.13 TIL (0) | 2023.06.13 |
2023.06.09 복습 (0) | 2023.06.10 |
2023.06.09 TIL (0) | 2023.06.09 |