1. AOP 프로그래밍
- AOP: 여러 객체에 공통으로 적용할 수 있는 기능을 분리해 재사용성을 높여주는 프로그래밍 기법이다.
1) pom.xml 설정하기
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.julian5383</groupId>
<artifactId>AopProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.28</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.19</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.19</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
- 의존성을 추가한다.
2) AOP 구현
[1] Audience.java
package com.julian5383.concert;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class Audience {
@Pointcut("execution(* com.julian5383.concert.Performance.perform(..))")
public void performance() {}
@Around("performance()")
public void watchPerformance(ProceedingJoinPoint jp) {
try {
System.out.println("Silencing cell phone");
System.out.println("Taking seats");
jp.proceed();
System.out.println("CLAP CLAP CLAP");
} catch (Throwable e) {
// TODO: handle exception
System.out.println("Demanding a refund");
}
}
}
- @Aspect 어노테이션을 적용한 클래스는 Advice와 Pointcut을 제공한다.
- @Pointcut은 공통 기능을 적용할 대상을 설정한다. concert 패키지와 그 하위 패키지에 위치한 타입의 public 메소드(해당 코드문에서는 perform 메소드)를 Pointcut으로 설정한다.
- @Around어노테이션은 Around Advice(대상 객체의 메소드 실행 전,후 또는 예외 발생 시점에 공통 기능을 실행하는데 사용)를 설정한다.
[2] Performance.java
package com.julian5383.concert;
public interface Performance {
public void perform() throws Exception;
}
[3] IUConcert.java
package com.julian5383.concert;
import org.springframework.stereotype.Component;
@Component
public class IUConcert implements Performance{
@Override
public void perform() throws Exception {
// TODO Auto-generated method stub
throw new Exception();
}
}
[4] PianoConcert.java
package com.julian5383.concert;
import org.springframework.stereotype.Component;
@Component
public class PianoConcert implements Performance{
@Override
public void perform() throws Exception {
// TODO Auto-generated method stub
System.out.println("Playing piano!!!");
}
}
[5] ConcertConfig.java
package com.julian5383.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import com.julian5383.concert.Audience;
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan(basePackages = {"com.julian5383.concert"})
public class ConcertConfig {
@Bean
public Audience audience() {
return new Audience();
}
}
- @Aspect 애너테이션 된 클래스를 실행시간에 자동으로 프록시 객체를 만들게 함
- Aspect 대상 객체가 인터페이스를 구현한 클래스 이면 proxy 객체도 해당 인터페이스를 구현하게 작성되므로 getBean() 매서드로 객체를 가져오려고 시도할 때 타입이 맞지 않아서 에러가 발생하게 됨, 이 때 proxy 객체를 대상 클래스를 직접 상속받아 만들게 하여야 하는데 이 때 사용하는 것이 proxyTargetClass = true이다.
[6] ConcertMain.java
package com.julian5383.main;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import com.julian5383.concert.IUConcert;
import com.julian5383.concert.Performance;
import com.julian5383.concert.PianoConcert;
import com.julian5383.config.ConcertConfig;
public class ConcertMain {
public static void main(String[] args) throws Exception{
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(ConcertConfig.class);
// 스프링 설정파일로부터 스프링 컨테이너 생성
Performance performance = ctx.getBean(PianoConcert.class);
performance.perform();
//스프링 컨테이너에서 빈객체를 가져온다.
System.out.println("------------------------------------");
performance = ctx.getBean(IUConcert.class);
performance.perform();
//스프링 컨테이너에서 빈객체를 가져온다.
ctx.close();
//어플리케이션 종료시 컨테이너에 존재하는 모든 빈 객체 닫기
}
}
--> 결과
Silencing cell phone
Taking seats
Playing piano!!!
CLAP CLAP CLAP
------------------------------------
Silencing cell phone
Taking seats
Demanding a refund
2. 스프링 MVC
- MVC 패턴은 애플리케이션을 개발할 때 사용하는 디자인 패턴이다.
- 애플리케이션의 개발영역을 MVC(Model, View, Controller)로 구분해 각 역할에 맞게 코드를 작성하는 개발 방식이다.
1) Model: 비즈니스 로직을 가지고 있는 부분
2) View: 시각적인 UI 요소를 지칭하는 용어
3) Controller: Model(모델)과 View(뷰)를 연결해주는 역할을 한다.
1) 톰캣 설정
[1] 아파치 톰캣 사이트에 들어간다. 그리고 톰캣 9버전을 선택한다.
Apache Tomcat® - Welcome!
The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the
tomcat.apache.org
[2] 64비트 버전을 다운로드 한다.
[3] 다운받은 zip파일을 이클립스 작업폴더 근처로 옮긴다.(찾기 쉽게하기 위해서이다.)
[4] zip 파일에 있는 apache-tomcat-9.0.76을 빼낸다.
[5] 이클립스로 들어와서 File->New->Other로 들어간다.
[6] Server->Server로 들어간다.
[7] Apache를 선택한다.
[8] 그리고 Tomcat v9.0 Server를 선택하고 Next>를 누른다.
[9] Browse...를 누른다.
[10] 미리 풀어둔 apache-tomcat-9.0.76폴더를 선택한다.
[11] Next >를 누른다.
[12] Finish를 누른다.
[13] 그러면 이렇게 서버가 뜨는 것을 확인할 수 있다.
2) 프로젝트 생성하기
3) 코드짜기
[1] MvcConfig.java
package com.julian5383.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer{
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// TODO Auto-generated method stub
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// TODO Auto-generated method stub
registry.jsp("/WEB-INF/views/",".jsp");//브라우저 상에서 접근 불가로 직접선언
}
}
- registry.jsp()코드는 jsp를 뷰 구현으로 사용할 수 있도록 해준다.
- 첫번째 인자는 접두사로 jsp 파일이 있는 경로를 지정한다.
- 두번째 인자는 접미사로 jsp파일 형식이 들어간다.
- 뷰 이름의 앞과 뒤에 각가가 접두사, 접미사가 붙어 jsp파일 경로를 설정해준다.
[2] pom.xml
- 의존성 4개를 추가한다.
- Servlet: 자바를 사용해 웹페이지를 통적으로 생성하는 서버측 프로그램을 말한다.
- JSTL: 자바서버 페이지 표준 태그 라이브러리은 Java EE 기반의 웹 애플리케이션 개발 플랫폼을 위한 컴포넌트 모음이다.
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.julian5383</groupId>
<artifactId>firstWeb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
<!-- -->
<dependencies>
<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>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.28</version>
</dependency>
</dependencies></project>
[3] web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>firstWeb</display-name>
<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>
<servlet>
<servlet-name>dispatcher</servlet-name>
<!--Dispatcher 라는 이름 등록-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param> <!--contextClass 초기화 파라미터를 설정한다.-->
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
<!--자바 설정 사용시 AnnotationConfigWebApplicationContext클래스를 사용한다.-->
<!--자바 설정을 이용하는 웹 어플리케이션 용 스프링 컨테이너 클래스이다.-->
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--contextConfiguration 초기화 파라미터 값을 지정한다.-->
<!--스프링 설정 클래스 목록을 지정한다. 각 설정 파일의 경로는 줄바꿈이나 콤마로 구분한다.-->
<param-value>
com.julian5383.config.MvcConfig
com.julian5383.config.ControllerConfig
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑을 설정했다.-->
</web-app>
- web.xml 파일에 DispatcherServlet을 설정한다.
- 스프링 MVC가 웹 요청을 처리하려면 DispatcherServlet을 통해 웹 요청을 받아야 한다.
- DispatcherServlet: 클라이언트 요청받은 주소와 매칭되는 특정 컨트롤러로 주소를 매핑해 해당 메소드를 호출하는 것이다.
[4] HelloController.java
package com.julian5383.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
//@Controller 어노테이션을 적용한 클래스는 스프링 MVC에서 컨트롤러로 사용한다.
public class HelloController {
@GetMapping("/hello")
//@GetMapping어노테이션은 메소드가 처리할 요청 경로를 지정한다.
//위 코드의 경우 "/hello"경로로 들어온 hello()메소드를 이용해 처리하는 것으로 설정함.
//HTTP메소드중 GET 메소드에 대한 매칭을 설정함.
public String hello(Model model, @RequestParam(value="name",required = false) String name) {
//@RequestParam 어노테이션은 HTTP요청 파라미터의 값을 메소드의 파라미터로 전달시 사용
//name 요청 파라미터의 값을 name 파라미터에 전달
//required=false: name값을 안주어도 된다.(required 디폴트는 true)
model.addAttribute("greeting","안녕하세요, "+name);
//Model 파라미터는 컨트롤러의 처리 결과를 뷰에 전달할 때 사용한다.
return "hello"; //컨트롤러 처리결과를 보여줄 뷰 이름으로 "hello"사용
}
}
[5] ControllerConfig.java
package com.julian5383.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.julian5383.controller.HelloController;
@Configuration
public class ControllerConfig {
@Bean
public HelloController helloController() {
return new HelloController();
}
}
- 컨트롤러 구현후 컨트롤러를 스프링 빈으로 등록한다.
[6] hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
인사말: ${greeting}
</body>
</html>
- src/main/webapp/WEB-INF 폴더에 view 폴더를 만들고 hello.jsp 파일을 추가한다.
- jsp파일에 있는 greeting은 컨트롤러 구현때 Model에 추가한 속성의 이름 greeting과 동일하다.
- 스프링 MVC 프레임워크가 모델에 추가한 속성을 JSP 코드에 접근할 수 있게 해준다.
--> 결과
'비트교육센터 > Spring' 카테고리의 다른 글
[비트교육센터][Spring] 스프링 34일차 스프링부트(2) (0) | 2023.07.18 |
---|---|
[비트교육센터][Spring] 스프링 33일차 RestAPI, 스프링부트 (0) | 2023.07.14 |
[비트교육센터][Spring] 스프링 32일차 jsp 게시판 만들기(2), SLF4J, WAV 배포, REST API (0) | 2023.07.13 |
[비트교육센터][Spring] 스프링 31일차 jsp 게시판 만들기(1) (0) | 2023.07.13 |
[비트교육센터][Spring] 스프링 29일차 의존주입(DI), 의존 자동주입, 컴포넌트 스캔 (0) | 2023.07.12 |