1. Restaurant.java
package com.test.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.Setter;
@Component //스프링이 관리할 객체라고 표시. <comtext:component-scan>이 가능
@Data //Restaurant의 getter/setter/toString/생성자 등등 다 자동 생성
public class Restaurant {
/*@Setter: 자동으로 setChef()를 컴파일 시 생성함.
* onMethod_: 생성되는 setChef()에 @Autowired 어노테이션을 추가.
* setChef(Chef) 메서드에 매개변수로 있는 Chef를 자동으로 주입하겠다.
* */
//방법 1. @Autowired
//방법2
@Setter(onMethod_=@Autowired)
//세터를 통해서 자동주입이 된다. 즉 셰프의 셋 메서드를 통해서 주입 받겠다.
private Chef chef;
/*Restaurant rt = new Restaurant(); --> 스프링이 객체 생성하도록
* -> rt.setChef(스프링이 객체 생성해둔 Chef 객체를 자동으로 매개변수 값으로 채우기);
* */
//방법3. xml에서 <bean>으로 이 클래스 생성할 때, <property> 태그로 set메서도 호출하여 채우줘는 형태로 작성
//component 스캔을 하면 이 방법은 문제가 생김.
}
2. 레스토랑.java 사용하기 위해 root-context에 스프링빈 등록
<bean id="restaurant" class="com.test.sample.Restaurant">
<property name="chef" ref ="chef1"></property>
</bean>-->
<context:component-scan base-package="com.test.sample"/>
<!-- 위에도 되고 이거도 됨. 이거는 자동으로 객체 생성.
[ ]-> root-context.xml -> Chef, Restaurant 생성-> Restaurant이 생성될 때 Chef가 주입됨-->
3. 테스트 파일. SampleTest.java
package com.test.sample;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
/*@Runwith: 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이라는 표시. 스프링에 있는 제이유닛4이용해서 돌릴거야.
* @ContextConfiguration: 지정된 클래스나, 문자열을 이용해 필요한 객체들을 스프링 내에 객체로 등록하게 해줌.
* ()안에 문자열은 'classpath:'나 'file:'을 이용할 수 있다. 여기서는 파일의 전체 경로를 줌.
* @Log4j: 로그 관련 사용하겠다.
* */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTest {
/*
@Autowired
private Restaurant restaurant;
//Chef, Restaurant 빈이 생성 잘 되었는지 체크하는 메서드
@Test
public void testExist() {
assertNotNull(restaurant);//null이 아니면 테스트 성공으로 체크해주는 메서드
System.out.println(restaurant);
System.out.println(restaurant.getChef());
}
//실행 방법: run - run as - junit test.
@Autowired
private HelloBean hello;
@Test
public void helloTest() {
log.info(hello);
log.info(hello.getNum());
log.info(hello.getMsg());
log.info(hello.getReg());
}
*/
}
4. 롬복. SampleHotel.java
//롬복
package com.test.sample;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Component //스프링이 관리할 객체라고 선언
@ToString //투스트링 자동 생성
@Getter //Get 메서드 자동 생성 (클래스에 붙이면 모든 변수에 적용)
//@Setter //Set 메서드 자동 생성
//클래스 레벨에서 생성자 만들기.
//@AllArgsConstructor //모든 인스턴스 변수를 생성자 매개변수로 갖는 생성자 생성
//@NoArgsConstructor //기본 생성자 자동 생성
//@RequiredArgsConstructor //원하는 변수들을 매개변수로 갖는 생성자 생성
//변수 위에 @NonNull이나 final이 붙은 변수에 대해서만 생성자에 매개변수로 포함.
public class SampleHotel {
//@Setter //set메서드 자동생성 (변수에 각각 붙이면 해당 변수에만 적용)
//@NonNull
private Chef chef;
public SampleHotel(Chef chef) {
this.chef = chef;
} //변수 하나에 생성자 하나면 알아서 채워준다...근데 알아보기 힘드니까 세터 등을 이용해서 명시해준다.
private int num;
}
5. 스프링빈
Hellobean.java
package com.test.sample;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class HelloBean {
private int num;
private String msg;
private Date reg;
public HelloBean(int num, String msg) { //빈으로 등록할때 무조건 매개변수 채워줘야함
this.num=num;
this.msg=msg;
}
}
root-context 추가
<property>
<bean id="date" class="java.util.Date"/>
<!--reg 위해서..-->
<!--3교시. 프로퍼티 스프링이 객체 생성. 기본 생성자 자동으로 호출
<bean id="hello" class="com.test.sample.HelloBean"/>-->
<!-- 값을 채워주면서 객체 생성. 하려면 셋 메서드가 필요.헬로빈에서 세터 생성 -->
<bean id ="hello" class="com.test.sample.HelloBean">
<property name="num" value="10"/>
<property name="msg" value="spring is coming"/>
<property name="reg" ref="date"/>
</bean>
<!-- HelloBean hello = new HelloBean();
hello.setNum(10);
hello.setMsg("Spring is coming"); 과 동일하다.
reg는 위에서 선언한 데이트 타입 객체를 넣어준다.-->
<constructor-arg>
<!-- 4교시 -->
<bean id ="hello" class="com.test.sample.HelloBean">
<constructor-arg index ="0" value="100"/>
<constructor-arg index ="1" value="message"/>
<property name="reg" ref="date"/>
</bean>
6. TestController
package com.test.controller;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.test.model.TestDTO;
@Controller
@RequestMapping("/day03/")
public class TestController2 {
@GetMapping("test01")
public void test01(String a) {
System.out.println("/day03/test01 호출");
System.out.println(a);
}
//form페이지 요청
@GetMapping("form")
public void form() {
System.out.println("form 요청@");
}
//폼에서 submit 눌러서 요청 되는 pro 요청 매핑
//http://www.localhost:8080/day03/pro?id=java&pw=123 넘어오는 데이터
@GetMapping("pro")
//1. 매개변수 나열해서 하나씩 따로 받기
// public void pro(String id, int pw){ //형 변환할 필요 없이 바로 자동으로 형변환해줌
//2. DTO 안에서 자동으로 바인딩해서 받기: 이때 바인딩 되는 객체 안에는 setter 존재해야함.
public void pro(TestDTO dto, HttpServletRequest request, HttpServletResponse response){
System.out.println("pro 요청!");
System.out.println("request: " + request);
System.out.println("request: " + request.getRequestURI());
// System.out.println("id: "+id);
// System.out.println("pw: "+pw);
//
// System.out.println(dto); //출력결과: TestDTO(id=java, pw=123)
// System.out.println(dto.getId());
// System.out.println(dto.getPw());
}
// 브라우저에 ...8080/day03/ex01?name=abc&age=10 입력할 것임.
@GetMapping("ex01")
//@RequestParam: 요청할 때 넘어온 파라미터를 명시적으로 매개변수 앞에 붙여서
//해당 파라미터는 이 매개변수에 담아야 된다고 알려주는 것.
//어노테이션을 붙이면 매개변수 이름은 파라미터 이름과 달라도 괜찮다.
public void ex01(@RequestParam("name") String myname,
@RequestParam("age")int myage) { //RequestParam: 넘어오는 파라미터를 age란 이름으로 myage에 담아라
System.out.println("ex요청");
System.out.println("name: "+ myname);
System.out.println("age: "+ myage);
}
//3 ArrayList로 받기
//day03/ex02?arr=a&arr=b&arr=c
@GetMapping("ex02")
public void ex02(@RequestParam("arr") ArrayList<String> arr) {
//RequestParam 을 이용하여 넘어오는 데이터를 명시해주기.
System.out.println("ex02 요청");
System.out.println(arr);
}
//4.배열로 받기
@GetMapping("ex02")
public void ex03(String [] arr2) {
//RequestParam 을 이용하여 넘어오는 데이터를 명시해주기.
System.out.println("ex02 요청");
System.out.println(arr2);
for(String a: arr2) {
System.out.println(a);
}
}
//뷰에 데이터 보내기
@GetMapping("ex03")
public void ex03(HttpServletRequest request, Model model) {
System.out.println("ex03 호출");
//key, value 형태로 request 객체에 속성 추가
request.setAttribute("name", "피카");
//model객체에 속성 추가
model.addAttribute("name2", "터미네이터");
}
}