TIL(2023.10.05)

JAKE·2023년 10월 5일

TIL

목록 보기
40/48
post-thumbnail

🏃‍♂️What I learned

1. Spring Project 생성

- Spring -> Spring Legacy Project -> Spring MVC Project -> package명 입력(최소 3레벨)

첫 생성에는 없음
-> Configure Template -> spring default 제외 나머지 삭제(바로 안뜨면 restart)

생성완료!


2. Spring project 설정


1. spring폴더(contect 보관 폴더) src/main/resources로 이동

2. web.xml(배포 서술자 : 서버 실행시 가장 먼저 읽음)설정

  • root-context의 위치 변경(1번에서 이동시킨 내용) : classpath:spring/root-context.xml

  • servlet-context의 위치 변경(1번에서 이동시킨 내용) : classpath:spring/appServlet/servlet-context.xml

    classpath : JVM이 프로그램 실행 시 클래스 및 설정 파일을 찾는 기준 경로)
    root-context - 객체(Bean)을 생성할때, 이곳에 요청에 따라 생성
    servlet-context - dispatcher servlet이 객체 생성 시, 이 곳에 요청에 따라 생성

  • web-app의 버젼 4.0으로 변경

  • xsi:schemaLocation : java를 JAVA로 변경, web-app버젼을 4_0으로 변경

  • 요청/응답 시 한글 깨짐 방지 필터 추가

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • Project Facets 변경 : Project -> properties -> Project Facets
    - Dynamic Web Module -> 4.0으로 변경
    - JAVA -> 11로 변경
    - Runtime -> Apache Tomcat 9.0 체크

3. pom.xml 설정

  • properties(공통적으로 사용할 버전 작성)
<properties>
<java-version>11</java-version>
<org.springframework-version>5.3.14</org.springframework-version>
<org.aspectj-version>1.9.9.1</org.aspectj-version>
<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>
  • dependencies : 외부 저장소와 의존관계 -> 외부 라이브러리 태그로 세팅( 외부 저장소 )
    - lombok 라이브러리(파워쉘 설치 해야함)
    - OJDBC 11 라이브러리
    - spring JDBC (스프링에서 JDBC 사용) : 버젼은 ${org.springframework-version}
    - Mybatis
    - Mybatis - Spring 연결 모듈
<!-- 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 : AOP 기능을 사용하기 위한 언어 문법 -->
		<!-- aspectjrt : AspectJ 런타임 프로그램 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- AspectJ Weaver : aspect의 정보를 바탕으로 aspect를 구성한 코드를 생성하는데 필요한 유틸리티 프로그램 -->
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
		
		<!-- Log4j (Logging) -->
		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-core</artifactId>
		    <version>2.17.1</version>
		</dependency>
		<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>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet -->
		<!-- Servlet 버전을 4.0으로 변경 -->
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
		    <groupId>javax.servlet</groupId>
		    <artifactId>javax.servlet-api</artifactId>
		    <version>4.0.1</version>
		    <scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		
		<!-- 단위 테스트 도구 (JUnit) -->
		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
		    <groupId>junit</groupId>
		    <artifactId>junit</artifactId>
		    <version>4.13.2</version>
		    <scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>${org.springframework-version}</version>
		    <scope>test</scope>
		</dependency>    
	</dependencies>
	
	<!-- build : 프로젝트 빌드 시 사용되는 플러그인 추가 및 버전 정보 설정 -->
    <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>
            
            <!-- 컴파일러 플러그인은 프로젝트의 소스(자바코드)를 컴파일하는 데 사용
			jdk 1.6 이상 사용 시 3.0 이상 버전을 사용, source, taget에는 사용하는 jdk 버전을 작성 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</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>
            
            <!-- Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer -->
			<!-- 메이븐 구성 문제로 인한 pom.xml 오류 발생 시 해결 -->
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.2.2</version>
			</plugin>
        </plugins>
    </build>

4. 최상위 경로 설정

  • Project -> Properties -> Web Project Settings -> Context root "/"로 변경

5. Maven에 의존하지 않는 라이브러리 추가

  • JSTL 라이브러리 -> webapp/WEB-INF에 lib 폴더 생성 후 추가

3. Spring에서 서버 실행 순서

첫 서버 실행시

  1. 메인 페이지("/", 최상위 폴더)를 열어달라는 요청이 들어옴 ->

  2. spring에서 web.xml을 처음으로 읽음 ->

  3. web.xml에 작성한 경로를 타고 servlet-context.xml을 읽음 ->

    • servlet-context의 내용 중
      - <annotation-driven /> 태그가 url매핑
      - <context:component-scan base-package="주소"> 태그가 주소 안에 있는 클래스를 bean으로 등록
  4. servlet-context.xml를 통해 ("/")가
    어노테이션(@RequestMapping)으로 매핑된 MainController의 forward 매서드를 읽음 ->

  5. MainController가 "common/main"을 return ->

  6. servlet-context.xml에 있는 viewResolver가 prefix와 suffix를 앞뒤로 연결하여 반환 ->

  7. prefix + common/main + suffix 가 응답

요약
1. 클라이언트 요청이 dispatcher-servlet으로 전달
2. dispatcher-servlet으로 전달된 요청에 대해 handler-mapping이 controller를 찾아 전달
3. controller는 이에 맞는 로직을 실행한 후 결과 값을 dispatcher-servlet으로 반환
4. 결과 값은 view-resolver의 명시에 따라 페이지 반환

** 결국 dispatcher-servlet, view-resolver, handler-mapping은 servlet-context.xml이 담당

0개의 댓글