[Spring] Day02 (Note): pom.xml 세팅, 컨트롤러, 메서드 리턴 타입, 의존성 주입
2022/3/17
라이브러리 추가 (pom.xml)
1. 롬복 lombok 1.18.22
https://projectlombok.org/download
-lombok.jar 다운로드 후 실행. 스프링 이클립스가 있는 폴더로 경로 잡아준 후 인스톨.
https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.22
-메이븐에서 Project lombok 1.18.22 복사해오기
2. Spring TestContext Framework » 5.1.5.RELEASE 디펜던시 추가
https://mvnrepository.com/artifact/org.springframework/spring-test/5.1.5.RELEASE
<!-- Spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<dependency> 스코프 포함 밑에 두줄 삭제하고 이렇게 바꾸기.
3. log4j 기존 주석 처리하고 1.2.17 버전 추가.
https://mvnrepository.com/artifact/log4j/log4j/1.2.17
프로그램이 돌아갈 때 문서 찍어주고 관리해준다.
4. junit 충돌 이슈 때문에 버전 4.12로 변경
5. 기존 javax.servlet 주석 처리하고 3.1로 변경 (맨 위에 servel-api 디펜던시만 변경)
https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0
6. <java-version>11</java-version>
<org.springframework-version>5.1.5.RELEASE</org.springframework-version>
<org.aspectj-version>1.9.3</org.aspectj-version>
<org.slf4j-version>1.7.30</org.slf4j-version>
<configuration> 내에 자바 버전도 업데이트하기
<source>11</source>
<target>11</target>
Controller
어노테이션
@Controller: 컨트롤러 클래스라고 명시
@RequestMapping: 메서드가 처리할 요청 경로를 지정함.
적용처: 메서드 위/ 클래스 위
메서드 위: 클래스는 @Controller 어노테이션이 부착되어 있어야 함.
클래스 위: 메서드 전에 경로 추가할 때 사용
*속성
value= “요청 경로”
method= 요청 방식: RequestMethod.GET, RequestMethod.Post
C Create Post방식
R Read Get방식
U Update PUT방식
D Delete DELETE방식
새로운 패키지 사용을 위한 객체 생성
xml 파일 내에서 객체 생성을 한다.
스프링 빈으로 등록. 스프링이 관리하는 객체. 우리가 일반적으로 알고 있는 객체와 똑같다.
<beans:bean class="패키지 명. 클래스 명">
<beans:bean class="com.test.controller.TestController">
이 방식은 모든 클래스를 하나하나 객체 생성을 해야 해서 번거롭다.
component 방식으로 패키지만 작성해놓으면 어노테이션이 붙어있는 클래스는 다 객체 생성을 해준다.
컨트롤러 메서드 리턴 타입
스프링 MVC의 구조가 기존의 상속과 인터페이스에서 어노테이션을 사용하는 방식으로 변한 이후 리턴 타입이 자유로워졌다.
1. String타입: 뷰 페이지를 jsp로 이용하는 경우에는 jsp파일의 경로와 파일 이름을 나타내기 위해 String을 사용한다. jsp를 타이핑하겠다... url의 경로와 파일의 이름이 달라도 됨.
2. void 타입: 호출하는 URL과 동일한 이름의 jsp를 의미함. 리턴이 없음. url과 경로를 맞춰줘야 한다.
3. VO, DTO 타입: 주로 JSON의 데이터를 만들어서 반환하는 용도로 사용. (ajax 사용할 때, view 경로 주지 않음) 화면을 바꿔주지 않음. 뷰 페이지로 바꿔주지 않고 데이터만 전달해줌
4. ResponseEntity 타입: 응답을 해줄 때, http 헤더 정보와 내용을 가공해서 전달해줄 때 사용
5. Model, ModelAndView타입: Model로 데이터를 전달하거나, view 경로(화면)까지 같이 지정하는 경우.
6. HttpHeaders 타입: 응답에 내용 없이 HTTP 헤더 메시지만 전달하는 용도로 사용
의존성 주입 DI: Dependency Injection
의존: 객체와 객체 간의 의존을 말한다.
ex) A객체에서 B객체를 필요로 한다면? A객체는 B객체에 의존한다고 말할 수 있다.
스프링에서는 이러한 의존도를 낮추기 위해서 개발자가 직접 new를 하지 않고, 설정 파일에 설정만 함으로써 프레임워크에서 알아서 생성하고 (Core의 BeanFactory에서 담당) 알아서 객체 주입(Injection)까지 해줄 수 있다.
->의존성 주입: 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식
객체 생성하기: -context.xml 파일.. 루트 콘텍스트에 <bean id="입력" class="입력"/>
의존성 자동 주입
: @Autowired
변수 위에 붙여주면 xml파일에 <bean>으로 등록된 스프링 빈(객체) 찾아서 자동으로 주입해준다. 객체 생성은 -context.xml 파일에 <bean id="입력" class="입력"/> 하여 bean으로 등록하고 필요한 곳에서 주입받아 사용 가능. 먼저 변수의 타입 먼저 확인해서 주입해줌
같은 타입의 빈이 여러 개 등록되어 있을 때는 변수 이름까지 맞춰줘야 한다. 아이디랑 변수 이름 맞추기.
@Autowired
private 클래스명 변수명;
* @Autowired 등으로 주입이 될 수 있는 상황
-context.xml 파일에 해당 클래스가 <bean>으로 등록이 되어 있거나 해당 클래스가 존재하는 패키지가 component-scan 되어 있고, 해당 클래스 위에 @Component, @Service, @Repository, (@Controller)가 붙어있어야 함.
*<context: component-scan …> 태그로 자동 객체 생성되는 어노테이션
@Component: 스프링이 관리해야 할 객체라고 표식
@Service: 비즈니스 로직 처리하는 클래스 위에 부착
@Repository: DAO 역할을 하는 클래스 위에 부착
@Controller: 컨트롤러의 역할을 하는 클래스 위에 부착
처음부터 정리
1. 프로젝트 생성 package Explorer> new> spring legacy project > “project name” > Spring MVC Project 선택 > top-level package 3단계로 적어주기 >
2. pom.xml 세팅 후 저장> 프로젝트 선택한 후 마우스 오른쪽 클릭 > Maven > Update Project
3. 프로젝트 서버에 올리기 > 톰캣 마우스 오른쪽> Add and remove> 올릴 프로젝트 선택 후 오른쪽으로 add. 그대로 실행하면 브라우저에서 URL 입력할 때 경로에 /controller를 포함해야 한다. 바꿔주고 싶다면 톰캣 더블 클릭> 모듈스> Path > edit> / 로 바꿔주기.
4. 기본 생성된 패키지 말고 새로운 패키지를 생성해서 사용할 때> servlet-context에 객체 생성해주기. <context:component-scan base-package="패키지 이름" />
5. 자바 클래스 생성> 클래스 명 위에 @Controller 붙여서 컨트롤러로 사용할 것이라고 알려주고 @RequestMapping 이용하여 경로 지정해주기.
6. 객체 생성 방법: root-context에 가서 <bean id="입력" class="입력"/> 하여 bean으로 등록하기