[21.10.14] Spring

yed·2021년 10월 14일
0

Spring

  • POJO(Plain Old Java Object)기반으로 java코드를 사용하는 프레임워크.
  • 메모리효율에 최적화됨.
  • DI(Dependency Injection), IoC(Inversion of Control).
    객체생성을 스프링이 직접 해줘서 개발자가 실수할 확률이 줄어듦.
  • AOP(Aspect-Oriented Programming).
    핵심 비즈니스 로직은 아니지만 보안, 로그, 트랜잭션 관리와 같은 부가기능들을 모듈화함.
  • MVC구조 지원
  • 기존 java에서 백엔드코드가 길어 가독성이 떨어지는 것을 개선함.
  • 자주쓰이는 것들이 기본탑재되어 단순하게 사용가능 (ex.싱글톤, db연결)
  • 라이브러리 직접설치가 아닌 xml 명시로 자동설치가 가능하다.

Spring 설치하기

  1. help->eclipse marketplace에서 sts검색

  2. spring tools 4spring tools 3 install

  3. Open Perspective -> Spring 선택

기존 java 환경에서 스프링을 사용하기 좋은 환경을 구성했다

maven 설치하기

maven은 라이브러리 설치를 도와준다. maven 설치 사이트

  1. Files -> Binary zip archive의 link apache-maven-3.8.3-bin.zip 설치

  2. 압축해제 후 폴더apache-maven-3.8.3를 C드라이브에 폴더만들어서 저장
    나는 Study로 했다.
    경로 : C:\Study\apache-maven-3.8.3

  3. 내 PC -> 속성 -> 고급 시스템 설정 -> 환경변수에서 path 클릭->
    새로만들기 눌러서 C:\Study\apache-maven-3.8.3\bin 추가

jdbc 라이브러리 추가하기

jdbc 라이브러리인 ojdbc6.jar 추가하기

mvn install:install-file -Dfile=[본인의ojdbc6.jar설치경로] -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar
  • cmd에 복붙해서 enter 누르기
  • BUILD SUCCESS가 뜨면 성공!

Spring Project 환경 설정하기

  1. new -> Spring Legacy Project로 프로젝트 만들기

  2. Spring MVC Project 선택하고 Next

  3. 프로젝트 경로 설정 후 만들면 MVC가 설치진행됨

  4. 생성된 프로젝트에서 마우스 우클릭->properties 접속

  • Project Facets-> Dynamic Web Module=3.1, java=1.8로 version 설정 후 apply
  • Server->tomcat v9.0 server at localhost 선택 후 apply
  • Targeted Runtimes->apache tomcat v9.0 선택 후 apply

이렇게 서버를 연결해놓으면 개발자가 선택하지 않아도 spring이 알아서 연결해줌.

Spring Regacy Project에 MVC Project 만들기

  1. Templates에 MVC가 없다면 configure templates클릭
  2. spring-defalut 빼고 다 remove하기
  3. Apply and Close 누르면 MVC project가 생겨있음

  • 프로젝트를 처음 만들고 보면 예시파일이 자동으로 만들어져있음. HomeController.java나 home.jsp
    파일들은 자동으로 MVC 형태를 갖추고 있다

  • http://localhost:8080/ex01/ 초반에 지정한 프로젝트 경로로 접속하면 views폴더에 생성된 home.jsp가 실행됨

  • src/test/.. : main경로와 별개로 test를 위한 패키지가 자동으로 만들어져 있음

  • Maven Dependencies : 많이 쓰이는 라이브러리를 자동으로 넣어놨음. 필요한게 있으면 추가도 가능하다

  • WEB-INF 속 views 폴더가 프론트사이드 위치.
    프론트사이드에 직접접근을 막아놓음
    뿐만 아니라 controller도 경로 직접접근이 막혀있다.

  • pom.xml : 프로젝트, 라이브러리 버전 등을 총괄해서 관리함.

  • servlet-context.xml에 있는
    <context:component-scan base-package="edu.spring.ex01" />
    controller, 서비스 등등 전부 컴포넌트의 하위개념.
    스프링은 객체를 자동으로 생성해서 사용하는데 스프링이 컴포넌트를 스캔하면서 관리할 때 객체도 자동으로 생성하는 것.

pom.xml 버전 변경하기

  • 스프링은 무슨버전을 설치했던간에 시작하면 3.1.1버전으로 자동설정되어있음. 기본설정되어있는 버전들을 실제 사용하는 버전으로 수정해주자
<properties>
	<java-version>1.8</java-version>
	<org.springframework-version>4.3.8.RELEASE</org.springframework-version>
	<org.aspectj-version>1.8.10</org.aspectj-version>
	<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>
  • <!-- Logging --> 부분 log4j 버전 변경
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
  • <!-- Servlet --> 부분
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
	<scope>provided</scope>
</dependency>
<dependency>
	<groupId>javax.servlet.jsp</groupId>
	<artifactId>javax.servlet.jsp-api</artifactId>
	<version>2.3.1</version>
	<scope>provided</scope>
</dependency>
  • <!-- Test --> 부분
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency> 
  • maven-eclipse-plugin부분. version 2.10으로 변경
<plugin>
	<artifactId>maven-eclipse-plugin</artifactId>
	<version>2.10</version>
	...
</plugin>
  • maven-compiler-plugin version 변경
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>3.6.1</version>
	<configuration>
		<source>${java-version}</source>
		<target>${java-version}</target>
		<compilerArgument>-Xlint:all</compilerArgument>
		<showWarnings>true</showWarnings>
		<showDeprecation>true</showDeprecation>
	</configuration>
</plugin>
  • exec-maven-plugin부분.
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>exec-maven-plugin</artifactId>
	<version>1.6.0</version>
	<configuration>
		<mainClass>org.test.int1.Main</mainClass>
	</configuration>
</plugin>

json파싱을 위한 라이브러리 pom.xml에 넣기

라이브러리를 모아놓는 저장소인 maven repository에서 사용할 버전의 라이브러리의 태그를 붙여넣으면됨.

라이브러리는 최신버전이라고 무조건 좋은건 아님. 안전성문제가 발생하거나 프로그램에 따라 적용이 안될수도 있음. 사람들이 가장 많이 사용하는 버전을 선택하는게 안전함

<dependency>
	<groupId>com.fasterxml.jackson.jaxrs</groupId>
	<artifactId>jackson-jaxrs-json-provider</artifactId>
	<version>2.11.3</version>
</dependency>

<!-- Test -->의 junit 바로 밑에 이어서 붙이면 된다.

web.xml 변경하기

  • 기존에 있던 <web-app> 설정 덮어쓰기
<web-app version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
  • filter 매핑하기
<filter>
	<filter-name>encoding</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>encoding</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

@Controller

  • servlet-context.xml 파일에서 component-scanning의 대상으로 만들어주는 어노테이션이다.
  • Component가 Controller의 상위개념이라 @Component 어노테이션을 써도 같음.
  • Controller는 기존의 servlet 통신과 동일. 평범한 java클래스에 @Controller 어노테이션을 설정하면 controller역할(통신 및 데이터이동 기존의 servlet역할)을 수행할 수 있도록 바뀜.
  • 기존 servlet에서 extends HttpServlet가 생략됨.

Logger

import org.slf4j.Logger

  • 스프링 프레임워크에서 로그를 사용하기 위한 객체
private static final Logger LOGGER = LoggerFactory.getLogger(SampleController1.class);
  • LOGGER.info("sample1() 호출");
    콘솔창에 INFO : edu.spring.ex01.SampleController1 - sample1() 호출라고 뜬다
    패키지명까지 자동으로 출력함

@RequestMapping()

  • 컨트롤러의 URL 매핑과 메소드(GET/POST/PUT/DELETE)를 설정한다.
  • value : URL 경로
  • method : 요청 방식 설정(GET, POST, PUT, DELETE)

    GET - 페이지를 불러오는 역할
    POST - 데이터를 저장하는 것
    PUT - 데이터 업데이트
    DELETE - 데이터 삭제

  • method 속성을 생략하면 GET/POST 둘 다 처리 가능하다
  • short cut 기능 : @GetMapping, @PostMapping, ...
    RequestMapping이 짧아져 나온 것. value만 존재
@RequestMapping(value="/sample1", method=RequestMethod.GET)
public String sample1() {
	LOGGER.info("sample1() 호출");	
	return "sample1"; //부르려는 jsp의 경로 및 이름
}

기존에 자바에서 requestURL.contains()을 사용해 매핑했던 것을 @RequestMapping을 사용해 매핑하는 것.

servlet-context.xml에서 접두사와 접미사로 경로를 지정해놓고 생략할 수 있게 만들어놓음.
설정된 WEB-INF/views/sample1.jsp로 찾아감

<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />

컨트롤러 메소드 return 값의 의미

  • ViewResolver에게 실체 view를 결정하도록 요청함
  • return 타입이 void인 경우 URL매핑(value값)을 통해서 스스로 view를 찾는다.
@RequestMapping(value="/sample2")
public void sample2() {
	LOGGER.info("sample2() 호출");
}
  • return값이 있을 땐 return 값을 view 파일명과 다르게 입력한 경우 오류발생

최대한 value(URL)와 메소드 이름, jsp 파일명까지 똑같이 만드는게 좋다.

Parameter 사용을 위한 Model과 매개변수

@GetMapping("/test1")
public String test1(Model model, String username, int age) {
	LOGGER.info("test2() 호출");
	LOGGER.info("username = "+username);
	LOGGER.info("age = "+age);
    
	model.addAttribute("username", username);
	return "param-test";
}
  • Model
    import org.springframework.ui.Model
    view에 데이터를 전송하기위한 객체
    key-value 방식.

  • username == request.getParameter("username");
    매개변수가 곧 데이터를 받아오는 변수가 된다.

  • int age parameter는 String으로 넘어오는데 스프링은 매개변수가 int이면 int형으로 자동 파싱된다. 단, 만약 int변수에 문자열값을 받게 되면 에러가 발생하기 때문에 예외처리 필요함.

@ModelAttribute()

매개변수 자리에서 사용하는 어노테이션. 요청받은 데이터를 바로 views에 전송함. 코드함축
데이터를 그대로 보낼때만 사용한다 가공불가능

@GetMapping("/test3")
public String test3(@ModelAttribute(name="username") String username, @ModelAttribute(name="age") int age) {
	return "param-test";
}
  • (name="username") == model.addAttribute("username", username);이 동일하다.

A클라이언트에서 받은 username을 서버가 B클라이언트로 전송함


....dh 어렵다 ༎ຶ‿༎ຶ

profile
6개월 국비과정 기록하기

0개의 댓글