하단에 있는 프로그램을 다운받아서 설치하기
이클립스 IDE
JDK-11
Tomcat 9.0.46 - 64bit-windowsZip
Maven 3.8.1
eclipse-inst-jre-win64.exe로 설치가 안되면 zip 파일로 받아서 압출 풀기
If tag mismatch fail 설치 문제시 - 하단 링크에서 설치파일을 이클립스로 드래그앤드랍
sts 4
https://marketplace.eclipse.org/marketplace-client-intro?mpc_install=1794107
sts 3
https://marketplace.eclipse.org/content/spring-tools-3-standalone-edition
결과 :
1 스프링 프로젝트 생성
File > New > Other > Spring Legacy Project > Spring MVC Project
2 톰켓 서버에 프로젝트 추가
3 결과물 (UTF-8 엔코딩 설정 전)
-vm
C:\Program Files\Java\jdk-11.0.12\bin\javaw.exe
1 src/main/java에 자바 파일을 보관
2 src/main/resources 스프링 설정 파일, 쿼리를 보관
3 src/test TDD 작성
4 src/main/webapp jsp, js 파일을 보관
5 servlet-context.xml, root-context.xml - 서블릿 설정 파일
폴더구조 2차:
/**
* Handles requests for the application home page.
*/
//비즈니스 로직 분기, 수행결과 응답해주는 Dispatcher 역할 담당하는 클래스
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
//클라이언트 jsp 요청에 해당하는 비지니스 로직을 찾는 역할.
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
//비즈니스 로직에서 수행한 결과를 화면에 보내줌.
//serverTime 이름으로 formattedDate을 전송.
model.addAttribute("serverTime", formattedDate );
/**
* 수행결과 응답을 보내주는 위치 명시. home = home.jsp
* 서블릿 설정에서 자동으로 앞에 /WEB-INF/view prefix를 붙여주고.
* jsp suffix를 붙여주게 되어 있다.
*/
return "home";
}
}
servlet-context.xml
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- 해당 경로에 있는 모든 스프링 빈을 어노테이션을 통해서 자동으로 인식하게 한다. -->
<context:component-scan base-package="com.company.first" />
C:\DEV-ENV\apache-maven-3.8.1\conf\settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<localRepository>C:\DEV-ENV\apache-maven-3.8.1\repository</localRepository>
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
pom.xml
1 라이브러리 추가
메이븐에서는 <dependency></dependency>
라는 태그를 통해서 각 라이브러리를 추가할 수 있다.
2 상수 추가
<properties></properties>
자바의 final static과 유사. 상수로 선언하기.
3 라이브러리 버전 관리
<org.springframework-version>3.2.4.RELEASE</org.springframework-version>
스프링 버전을 정의 버전 변경시 숫자만 바꾸면된다.
4 라이브러리 다운 위치
<repositories></repositories>
라이브러리를 다운받을 저장소
5 라이브러리를 프로젝트에 지정
<dependencies><dependencies>
스프링 : 자바 언어 기반 오픈 소스 웹 프레임워크. POJO
프레임워크 : 자주 쓰는 유틸(클래스)의 모음(집합)
AOP(Aspect Oriented Programming) : 모듈 분리
로깅, 트렌젝션, 보안 등 모듈을 분리해서 관리할 수 있다. 필요할 때만 호출.
DI(Dependency Injection) : 외부 설정에 모듈 정의해서 결합도 최소화.
구성요소간 의존관계를 내부 소스코드가 아닌 외부 설정파일로 정의. 모듈 결합도를 낮춤. 즉 JAVA 데이터 저장하는 기능을 외부 Oracle DB를 사용할 수 있고 , JDBC, iBatis, JPA 등 다른 프레임워크로 짤 수 있다.
IoC(Inversion of Control) : 객체 생명주기 관리
객체 생명주기를 스프링 컨테이너에서 관리.
사용자 인터페이스와 비즈니스 로직을 분리해서 웹 개발
Model : 애플리케니션 정보/데이터 처리
View : 사용자가 프로그램을 사용하는 엔터페이스 (웹페이지)
Controller : 비즈니스 로직과 모델의 상호작용 중재. MVC2에서는 서블릿 흐름 제어
사진 출처 : http://blog.daum.net/gunsu0j/165
Bean : 스프링 컨테이너 안에 있는 객체
annotaion을 사용하여 일반적인 객체를 bean으로 등록할 수 있다
의존성 주입을 하기 위해서는 Bean이 되어야한다.
spring이 bean의 의존성을 관리해준다.
IOC(Inversion of Control) : 객체 선언을 하지 않고 객체를 받아서 쓴다.
예)
/*
일반적인 제어권: 자기가 사용할 의존성은 자기가 만들어서 사용
*/
@Service
public class CarService {
private CarRepository carRepository = new CarRepository();
}
/*
Inversion Of Control
다른 누군가가 의존성을 밖에서 준다.(제어권의 역전)
의존성을 주입해주는 일:Dependency Injection(일종의 IOC)
*/
@Service
public class CarService {
// CarRepository를 사용은 하지만 만들지는 않는다.
private CarRepository carRepository;
/*
생성자를 통해서 받아온다.
따라서 의존성을 관리하는 일은 CarService가 하는 일이아니다. 누군가 밖에서 해주는 것이다.
*/
public CarService(CarRepository carRepository){
this.carRepository = carRepository;
}
}
Concern : 다른 클래스에 비슷한 기능을 하는 부분 (메소드, 코드)
Advice : 해야할 일, 기능
Pointcut : 어디에 적용해야하는지 (A클래스, W 메소드)
Target : 각각 클래스 (클래스 A, B, C)
Join point : 끼어들 지점 (메서드 실행시, 필드에서 값을 가져갈 때)
1 만약에 노란색 기능을 수정하려면 각각 클래스에서 수정해줘야 해서 유지보수가 불편하다.
2 그래서 이렇게 흩어진 기능을 Aspect를 사용해서 모은다. 각각 Concern을 Aspect로 만들어주고 어느 클래스에서 사용할지 입력해주면 아래 그림처럼 Aspect가 모듈화된다.
AOP 적용은 런타임에 실행된다.
컴파일 타임 : 소스코드 -> .exe 코드
런 타임 : .exe코드 -> 실행
https://addio3305.tistory.com/32
https://www.toolsqa.com/java/maven/how-to-install-maven-eclipse-ide/
https://jerryjerryjerry.tistory.com/62
https://velog.io/@max9106/Spring-AOP%EB%9E%80-93k5zjsm95
https://velog.io/@max9106/Spring-IOCInversion-Of-Control-Bean-%EB%93%B1%EB%A1%9D%ED%95%B4%EB%B3%B4%EA%B8%B0