Spring์ ์ด์ฉํด ์์ฐจํ์๊ณผ ์ด์งํ์์ ์๋์ฐจ์ด๋ฅผ ์ฌ๋ณด์๋ค.
Controller์ Service๋ฅผ ๋ถ๋ฆฌํ๊ณ AOP๋ ์ ์ฉํด๋ณด์๋ค.
SearchController.java
package kr.org.exam.search.controller;
import kr.org.exam.search.service.Search;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class SearchController {
private Search search;
@Autowired
// Search ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋์ง๋ฅผ ํ์ธํ ํ์ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ณ์์ ์ฃผ์
ํ๋ค.
public void setSearch(Search search) {
this.search = search;
}
// URL ํจํด์ ๋งคํํ์ฌ ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๋ค.
// URL์ด localhost:8080/search ์ผ ๋ ์๋ test ๋ฉ์๋ ์ํ
@RequestMapping(value = "/search", method = RequestMethod.GET)
public String test() {
search.SequentialSearch();
search.BinarySearch();
return "search";
}
}
Search.java
package kr.org.exam.search.service;
// ์์ฐจ, ์ด์งํ์์ ์ํ ์ธํฐํ์ด์ค
public interface Search {
String BinarySearch();
String SequentialSearch();
}
SearchImpl.java
package kr.org.exam.search.service;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
// Service์์ ๋ช
์
// ComponentScan์ ํตํด ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
@Service
public class SearchImpl implements Search {
private List<Integer> data = new ArrayList();
private int key = 9999999;
// ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ๋๋คํ ์๋ค์ ๋ฆฌ์คํธ์ ๋ฃ๋๋ค.
public SearchImpl() {
for (int i = 0; i < 10000000; i++) {
// data.add((int)(Math.random() * 10000 + 1));
data.add(i);
}
// Collections.sort(data);
}
// ์์ฐจ ํ์์ ์ํํ๋ค.
@Override
public String SequentialSearch() {
data.indexOf(key);
// TimeMeasure์์ ๋ณธ ํจ์๊ฐ ์คํ๋์์์ ํ๊ธฐํ๊ธฐ์ํด String์ผ๋ก ๋ฐํ
return "SequentialSearch";
}
// ์ ๋ ฌ ~ ์ด์งํ์๊น์ง ์๊ฐ์ธก์ ์ ๋ฃ์๋ค.
@Override
public String BinarySearch() {
Collections.binarySearch(data, key);
// TimeMeasure์์ ๋ณธ ํจ์๊ฐ ์คํ๋์์์ ํ๊ธฐํ๊ธฐ์ํด String์ผ๋ก ๋ฐํ
return "BinarySearch";
}
}
์๊ฐ์ ์ธก์ ํ๋ ๋ถ๋ถ์ด ์์ฐจํ์, ์ด์งํ์ ๋ ๋ฉ์๋์ ๊ณตํต๋ ๊ธฐ๋ฅ์ด๋ฏ๋ก TimeMeasure.java๋ก ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ค.
TimeMeasure.java
package kr.org.exam.search.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
// AOP์์ ๋ช
์ํ๊ธฐ ์ํ ์ด๋
ธํ
์ด์
@Aspect
// Component๋ก ๋ฑ๋กํจ์ผ๋ก์จ dispatcher-servlet.xml์์ ์ค์ ํด๋ Component scan์์ ํด๋น ํด๋์ค๋ฅผ ์ฐพ์ ๋น์ผ๋ก ๋ฑ๋ก
@Component
public class TimeMeasure {
// ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋ ์คํ ์ , ํ์ ๊ณตํต ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด @Around ์ฌ์ฉ
// execution ๋ฌธ์ "kr.org.exam.search.. ํจํค์ง ์๋์ ์๋ ๋ชจ๋ ํ์ผ ์ค Search๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋ ์ค ํ๋ผ๋ฏธํฐ๊ฐ 0๊ฐ ์ด์์ธ ๊ฒ์ด ์คํ๋ ๋" ๋ฅผ ์๋ฏธํ๋ค.
@Around("execution(* kr.org.exam.search.service.*.*Search(..))")
// Around ์ด๋๋ฐ์ด์ค๋ฅผ ๊ตฌํํ ๋ฉ์๋๋ ProceedingJoinPoint๋ฅผ ๋ฐ๋์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํด์ผํ๋ค.
public Object measure(ProceedingJoinPoint joinPoint) throws Throwable {
double start = System.nanoTime();
// joinPoint.proceed()๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ถ๋ถ์ Before, ์๋๋ถ๋ถ์ AfterThrowing ๋ถ๋ถ์ผ๋ก ๊ตฌ๋ถ์ง์ด์ง๋ค.
// proceed()์ ๋ฆฌํด๊ฐ์ด Object์ด๋ฏ๋ก ์๋ result๋ณ์๋ฅผ Object๋ก ์ค์ ํ๋ค.
// Aspect๋ก ์ฐ๊ฒฐ๋ ๋ณธ๋ ๋ฉ์๋์ ๋ฆฌํด๊ฐ์ ํ๋ณํํ์ฌ ๋ฐ์ ์ ์๋ค.
Object result = joinPoint.proceed();
double stop = System.nanoTime();
// joinPoint.proceed()๋ ๋์ ํฌ์ธํธ์ปท ์ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ค. (ํด๋น ๋ฉ์๋์ return๊ฐ์ ๋ฐํ)
System.out.println(result);
System.out.println(stop - start + "ns");
return result;
}
}
์ด๋ก ๋ง๋ณด๋ค๊ฐ ์ค์ตํด๋ณด๋ ์ ๋ง ๋ง์ด ๋ชจ๋ฅด๊ณ ์์๋๊ฒ์ ์์์์๋ค.
์ถ๊ฐ๋ก view๋จ์ Controller์ ๊ฐ์ ๋๊ธฐ๋๊ฒ์ ์์ง ๋ชจ๋ฅด๊ฒ ๋ค..
'๐ฑ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
cannot resolve web.servlet.view.InternalResourceViewResolver (0) | 2020.03.15 |
---|---|
์ค๋ฅํ์๊ธฐ๋ก (1) | 2020.03.13 |
Lombok ์ ๋ฆฌ (0) | 2020.02.12 |
Log4j ์ ๋ฆฌ (0) | 2020.02.12 |
[IntelliJ] Spring MVC, Maven ํ๊ฒฝ ์ค์ ํ๊ธฐ (0) | 2020.02.11 |