Java&SpringBoot

7주차) 패스트캠퍼스 Java & Springboot 로 시작하는 웹 프로그래밍

은line 2023. 3. 5. 12:19

 @RequestParam 

▶ @RequestParam (required = true)  // 필수입력이지만 값 입력x 시 400대(Client) Error

▶ @RequestParam (required = false, defaultValue="url에 값이 없을때 대입시킬 기본값")

    //defaultValue 주지 않으면 500대(Server) Error

[EX]

public String main(HttpServletRequest request){  }


public String main2(@RequestParam(name="year", 
                                                        required=false)

== public String main2(String year) {  }

public String main3(@RequestParam(name="year", required=true) String year)
  == public String main3(@RequestParam String year) {   }



public String main5(@RequestParam(required=false, defaultValue="1") String year) {  } 


[RequestMapping 대신 Get/PostMapping사용] 

      ex) 경로- "/mapping/examp" (메소드로 구분)

▶@RequestMapping((공통경로)"/mapping") + GetMapping("/examp") / PostMapping("/examp")

 

- @GetMapping 

== @RequestMapping(value="경로", method=RequestMethod.GET)

== <servlet-context.xml>파일에 <view-contorller path="경로" view-name="jsp파일명"/>추가  (GET만 허용)

 

- @PostMapping("경로")  

== @RequestMapping(value="경로", method=RequestMethod.POST)

 

 @ModelAttribute 

 : 적용대상을 Model의 속성으로 자동 추가해주는 애너테이션, 반환타입 or 컨트롤러 메서드의 매개변수에 적용가능

 > 호출, 저장이 따로 필요 없음

 

[EX]

@Controller
public class 클래스{

    public String main(@ModelAttribute("myDate") MyDate date, Model m) { 
      == public String main(@ModelAttribute MyDate date, Model m) { 

      == public String main(MyDate date, Model m) {  //참조형(MyDate date)은 @ModelAttribute 생략가능

      // 1. 유효성 검사 
        if (!isValid(date))   return "yoilError";
      // 2. 처리
        char yoil = getYoil(date);

      // 3. Model에 작업한 결과를 저장할 필요 없음  View로 자동 전달됨.

      // 4. 작업 결과를 보여줄 뷰의 이름을 반환  
           return "yoil";

    }

}

> 컨트롤러 매개변수가 기본형,string일때 : @RequestParam생략된 것
> 컨트롤러 매개변수가 참조형일때 : @ModelAttribute 생략된 것

 redirect 

[in JSP]

 300번대(응답헤더)응답시 자동으로 헤더의 location으로 재요청(GET) / 요청과 응답이 2번

[in Spring]

 DispatcherServlet에 요청> Controller의 메소드 호출 > Controller가 리턴값(redirect:경로) 전달 > DispatcherServlet가 RedirectView에 전달 > 응답 

 

 forward 

[in JSP]

 잘못된 경로로 혹은 일부만 처리할 수 있는 파일(1jsp)에 요청시 가능한 처리하고 다른 파일(2jsp)로 요청전달

> 응답 > 1jsp가 2jsp에 request를 Model(request객체)에 담아서 전달 / 1jsp = Controller역할, 2jsp = View역할 (MVC패턴)

[in Spring]

 DispatcherServlet에 요청> Controller의 메소드 호출 > Controller가 리턴값(forward:경로")을 DispatcherServlet에게 반환 > DispatcherServlet가 InternalResourceViewResolver에게 받은 문자열 전달 > 해석 후 다시 서블릿에 반환 > JstlV iew에 경로를 전달 > Jsp파일에 Model을 전달 > Jsp파일이 응답

 

 Cookie 

: 이름과 값의 쌍으로 구성된 정보로 아스키 문자만 가능

: 서버에서 생성/ 브라우저에 저장/ 유효기간 이후 자동삭제

: 서버에 요청시 domain, path(하위경로포함)일치시 전송(응답헤더: Set-Cookie: id=id값; Max-Age=86400)

 

* 생성

Cookie cookie = new Cookie("id","id값"); //쿠키생성
cookie.setMaxAge("60*60*24"); //유효기간설정[sec] (=24시간)
response.addCookie(cookie); //응답에 쿠키 추가

개발자 도구에서 생성 > [Application] [Cookies] 탭에서 name, value값 입력

쿠키 존재시 login form에 자동으로 아이디 기억 체크박스 체크하기 > ${empty cookie.id.value ? " " : "checked"}

 

* 삭제 ( =유효기간이 0)

Cookie cookie = new Cookie("id",""); //동일한 이름 쿠키생성
cookie.setMaxAge(0); //유효기간설정[sec] (=0 =삭제)
response.addCookie(cookie); //응답에 쿠키 추가

* 읽기

Cookie[] cookie = request.getCookies(); //read, 존재x시 null
for(Cookie cookie:cookies){
	String name = cookie.getName(); // id
    String value = cookie.getValue(); // id값
	System.out.println(name, value);
}

 Session 

: 서로 관련된 독립된 요청들을 쿠키를 이용하여 하나로 묶은 것으로 쿠키가 브라우저에 저장되므로, 브라우저마다 개별 저장소(Session)를 서버에서 제공 > 쿠키는 브라우저에, 세션은 서버에 저장

 


  Spring DI(Dependency Injection)  

** DI 의존성주입 : 사용할 객체를 외부에서 주입(라이브러리의 매개로) 받는것 

 

[in Java] Beans : 재사용 가능한 컴포넌트, 상태(iv),. 게터&세터, no-args constructor

[in Servlet & JSP] Bean : (mvc의)Model, EL, Scope, JSP container가 bean을 관리

[in Spring] Bean

: 복잡한 EJB의 규칙을 심플하게 만듬 (POJO), Spring container가 관리하는 객체 - 단순, 독립적

<.xml> bean 정의됨

→ spring container에서 읽어드리고 클래스/객체관리, bean저장/관리(생성, 소멸, 연결(AutoWired))

 

IoC(Inversion of Conrol, 제어의 역전)

: 제어(if, for)의 flow흐름을 전통적인 방식과 다르게 뒤바꾸는 것

: 변하지 않는 코드만 라이브러리안에, 잘 변하는 코드는 사용자 코드에 작성 (= DI 의존성주입)

ex)

전통적인 방식
사용자가 라이브러리 코드를 호출
 IoC
라이브러리에서 사용자 코드를 호출
[사용자]
Car car = new Car();
car.turboDrive();

[라이브러리]
void turboDrive(){
  engine = new turboEngine();
  engine.start();
}
[사용자]
Car car = new Car();
car.drive(new turboEngine()); // 수동연결

[라이브러리]
void turboDrive(){
  engine.start();
}

 

> 변경에 유리한 코드 

** 다형성 

class SpotsCar { }
class Truck { }

SpotsCar car = new SpotsCar();

Truck car = new Truck();
class Car{}
class SpotsCar extends Car{}
class Truck extends Car{}

Car car = new SpotsCar();
Car car = new Truck();

 팩토리메서드 

Car car = getCar();

static Car getCar() { return new SpotsCar() || new Truck();}

 

 Map과 외부파일  (파일.txt의 내용만 변경하면 됨) 

public static void main(String args[]){
	// 리턴 받은 객체 해당 클래스로 형 변형
	Car car = (Car)getObj("key값");
	// 호출부분만 변경하면 용이
	클래스 객체참조변수 = (클래스)getObj("key값");
}
static Obj getObj() {
	 //Properties:(String,String) == Map:(String,obj)
	Properties p = new Properties();
    // 파일.txt > key = 패키지명.class명
	p.load(new FileReader("파일.txt");
	Class clazz = Class.forName(p.getProperty(key));
	 // 객체 생성후 반환
	return clazz.newInstance();
}

 컨테이너사용 

자동객체 등록하기 (위 코드에서 getbean 추가)

 

 @Autowired 객체 자동연결 

guava 다운로드 -  https://mvnrepository.com/artifact/com.google.guava/guava/31.1-jre

[pom.xml]

<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency> //추가해줌
...
</dependencies>

이후 우클> maven > reload

 

: 인스턴스변수iv, setter, 참조형 매개변수를 가진 생성자, 메서드에 적용

: 생성자(construtor)는 @Autowired 생략가능

Appcontext()에 추가

 

: 타입(value로 instance of) 검색해서 연결

: 검색된 bean이 여러개 > 참조변수와 이름이 일치하는 것 주입

 

@Component // == Component ("turboengine == bean의 id ")

class TurboEngine extends Engine{}

-------

@Component ("engine") //engine == bean의 id

class SuperEngine extends Engine{}

 

> DI대상이 변수일때

@Autowired Engine engine;  //1개가 아니면 예외발생

// SuperEngine과 이름 일치 >  주입

 

> DI대상이 배열일때

@Autowired Engine[] engines;//bean이 0~n개여도 예외발생 x

// SuperEngine과TurboEngine 모두 주입

 

 

 

 

 

 

 @Resource (name=" bean의 id") 

: 이름(key값=name)으로 bean 검색하여 참조변수에 연결(자동주입 DI)

: 일치하는 이름(name)의 bean 없으면 예외 발생

: name생략가능> 참조변수 이름이 bean의 name이 됨

ex) 

class Car {

  @Resource(name="engine")  Engine engine; }

 

 

**setter로 객체의 값 set시

class Car {
    String color;
    int oil;
    Engine engine;
    Door[] doors;
    ..//getter, setter
 }
 
 public static void main(String[] args) {
        Car car1 = (Car) ac.getBean("car");
        Engine engine = (Engine) ac.getBean("engine");
        Door door = (Door) ac.getBean("door");

        car1.setColor("red");
        car1.setOil(100);
        car1.setDoors(new Door[]{ (Door) ac.getBean("door"), (Door)ac.getBean("door")});
        car1.setEngine(engine);
 }

setter 사용 대신 

[config.xml]의 bean으로 작성   

<bean id="car" class="com.fastcampus.ch3.Car">
        <property name="color" value="red"/>
        <property name="oil" value="100"/>
        <property name="engine" ref="engine"/>
        <property name="doors">
            <array value-type="com.fastcampus.ch3.Door">
                <ref bean="door" />
                <ref bean="door" />
            </array>
        </property>
</bean>

<bean id="engine" class="com.fastcampus.ch3.Engine"/>
<bean id="door" class="com.fastcampus.ch3.Door" scope="prototype"/>

 



[내일배움카드] [국비지원교육]