@ModelAttribute의 숨겨진 기능을 보겠다.

controller는 코딩이 짧을수록 좋다. controller의 본연의 기능인 주고받는 기능만 있으면 된다.

@ModelAttribute를 사용하면 코딩이 짧아진다.
추가로, 화면단에서는 도큐먼트레디 안의 양이 적을수록 좋다. 화면 몇 개를 호출하는지 알 수 있을 정도만 하면 된다.
controller는 업무당 하나를 만드는데

만약,  3개의 화면을 호출할려면 하나의 controller에 3개의 메서드를 만든다. 
하지만 @ModelAttribute를 사용하면 간단해진다. 

 

 

@ModelAttribute를 메서드 밖에 주고  알리아스(alias)를 준다. 

이 알리아스는 model.addAttribute의 키와 같다. 
@ModelAttribute에 쓰인 키에 모든 결과 값이 들어간다.  
결과는 return selectBoxService.selectParentBoxList( );로

이걸 몇 개씩 사용해서 쓰면 코딩이 엄청 짧아진다. 

 

 

@ModelAttribute controller에 있는 메서드 중에서 가장 먼저 실행이 된다.  
@RequestMapping보다 먼저 실행된다.

 

 

 

 

출처  :  한큐에 자바 수강내용

어노테이션(@)의 선언목적은 무엇일까?

Spring에게 해당 파일의 역할을 알리고 그에 맞는 어노테이션을 지원하기 위해서다.

예를 들어,

@Controller을 쓰는 이유는 @Controller 하위에 있는 어노테이션(@)을 쓰기 위해서다.  
하위 어노테이션 중에 @RequestMapping이 있다.  
@RequestMapping은 @Controller이 적혀있지 않으면 사용할 수 없다. 

@Service과 @Mapper도 마찬가지다 .

 

 

mvc패턴은 

컨트롤러  -> 서비스  ->  서비스임플  ->  맵퍼  ->  DB  ->  서비스임플  ->  서비스  ->  컨트롤러

순으로 데이터가 이동한다.

controller  ->  service  ->  serviceImpl  ->  mapper  -> db(sql)로 갔다가 다시 와서 
논리적주소와 모델을 내려준다. 

 

이 MVC패턴에서의 데이터이동을 더 자세하게 보면

@Controller를 읽어들이는 애가 있는데  dispatcher-servlet이다. 
dispatcher-servlet은 화면(view)과 Controller사이에 있다.
(dispatcher-servlet가 데이터를 들고 컨트롤러로 이동하는데 컨트롤러가 받고 이동)

View에서 Controller로 바로 보내는 것이 아니라 dispatch-servlet에 있는 Adaptor가 보낸다. 
이 어댑터는 RequestMappingHandlerAdaptor다. 

이 Adaptor가 키와 벨류를 받는다.
참고로, Spring은 어댑터 방식이다. 어댑터가 다 이동시킨다.

 Adaptor가 @RequestMapping을 찾아가는데 다짜고짜 찾아가지 않는다.  

 




++참고  :  DI는 DI컨테이너(context.~.xml)에 등록되어있다. 여기에 등록되려면 자격이 있어야 한다.  
@Conponent이 적혀있는 DI만 등록할 수 있다. 
@Controller를 눌러보면 @Conponent이 적혀져 있는 것을 볼 수 있다. 

@Service, @Mapper에도 다 @Conponent가 적혀져 있다. 

이런 애들을 다 긁어서 bean으로 등록(DI)시켜주는 애가 dispatcher-servlet에 살고있는 ConponentScan이란 애다. 

 


 

mvc패턴은 Controller에서 DB까지 데이터가 이동했다가 논리적주소와 모델을 내려준다고 했다.
논리적주소와 모델을 내리는 애는 dispatcher-servlet에 살고있는 JstlView다. 얘는 화면을 그리는 애다.

이 JstlView는 화면(html)을 그리다가 동적으로 생성되는 부분(C태그)을 만나면

Controller에서 받은 모델을 바라보고 내린다. (JSTL을 말함)
모델을 참고해서 내리기 때문에 JstlView이다. 

JstlView가 dispatcher-servlet한테 주는데 사람의 눈으로 볼 수 있는 상태가 아니기 때문에

servletContainer 한테 주고 이 컨테이너는 브라우저 통신(HTTP통신)으로 파싱해서 브라우져에 뿌려준다. 
그냥 뿌리는 것이 아니라 논리적주소를 참고해서 브라우져에 뿌려준다.

http통신(화면요청)에서 톰캣서버가 일어나서 dispatcher-servlet로 가고 

dispatcher-servlet에서 RequestMappingHandlerAdaptor가 받는다. 

RequestMappingHandlerAdaptor가 컨트롤러에 @requestMapping을 찾아간다.
모델이랑 뷰를 생성해서 dispatcher-servlet한테 주고 

dispatcher-servlet에 있는 JstlView가 화면을 생성하는데 c를 만나면 모델을 참고하는데
dispatcher-servlet가 이것을 다시 받아 servletContainer가 http통신을 통해서 파싱해서 사람눈으로 보여준다.

정리  :  
dispatcher-servlet한테 http요청을 하면 dispatcher-servlet는 Controller한테 요청을 해서 모델을 생성한다.
Controller는 dispatcher-servlet한테 모델과 뷰를 반환한다.
dispatcher-servlet는 뷰한테 모델을 주고 뷰는 생성을해서 dispatcher-servlet한테 준다.
dispatcher-servlet는 http응답을 한다.

 

 

 

출처  :  한큐의 자바 수강내용 참고

인스턴스란 ? https://victor8481.tistory.com/280

참고로 읽어보기

 

 

인스턴스를 생성하는 방법에는 여러 가지가 있다.
첫번째로 new로 생성하고
두번째로 DI로 생성한다. 
세번째로 @resource로 생성한다.

 

먼저, new인스턴스를 생성하는 방식이다. 기존 클래스 생성방식으로 내부에서 생성하는 것이다.

 

 


 

 

 그 다음에, DI로 인스턴스를 생성하는 방식이다. DI컨테이너에서 생성하는 방식으로 외부에서 생성하는 것이다. 

resources폴더에 context파일이 모아져 있다. 

context.어쩌고.xml파일을 보면 태그가 있는데 이걸 DI라고 부른다. 

DI는 Dependency injection의 약자로 의존성 주입이라는 뜻이다.

그리고 context.어쩌고.xml은 DI컨테이너라고 한다. DI가 모여있는 박스라고 보면 된다. 

DI컨테이너에 bean하나를 넣는 작업을 injection(주입)이라고 한다. 

(+마찬가지로 프로젝트폴더에 있는 pom.xml에 bean을 넣는 것을 주입한다고 한다) 
DI컨테이너에서 인스턴스를 생성한다.(따로 설정해야 함) 
DI컨테이너에서 꺼내서 사용한다는 것을 lookup(룩업)이라고 한다. 

원래는 클래스에서 인스턴스 생성을 하지만 스프링에서는 DI컨테이너에서 인스턴스를 생성한다. 
기존에는 인스턴스 변수에다 자기 자신이 클래스에서 new로 생성했다면 , xml에서는 DI컨테이너에서 한다.(대신한다) 
이것이 바로 제어의 역전이다. IOC라고 하며 약자는 Inversion Of Control이다. 


DI컨테이너의 장점이다.
첫번째로 Java파일은 class라는 확장자가 필요하지만 xml은 필요가 없다. 
두번째로 많은 자바를 고칠 필요가 없다. 
세번째로 수 많은 자바 파일을 관리할 수 있다.  
마지막으로 프로세스의 생명주기를 하나의 파일로 볼 수 있다.    

정리  :  DI컨테이너의 역할은 자기 자신을 대신해 DI를 생성해준다.  
          하나의 빈을 생성하는 것을 DI(주입)라고 한다.  
          주입한 것을 꺼내는 작업을 룩업이라고 한다. 
          IOC는 inversion of controll의 약자이고 제어의역전이라고 한다. 
          이것이 스프링의 기본이다 

 

 


 

 

그리고 @Resource로 인스턴스를 생성하는 방식이다.

@Resource의 위치는 클래스명 한 칸 아래, 첫 번째 메서드 한 칸 위에 위치한다. 

원래는  controller에서 service,

          service에서 serviceImpl, 

          또 serviceImpl에서 mapper로 이동할 때마다 new로 인스턴스를 생성해야한다. 

스프링은 인스턴스를 생성하지 않고도 갈 수 있다. 이것이 바로 스프링의 장점이다. 바로 @Resource이다. 

또를 DI컨테이너박스에서 여러 줄로 설정해서 사용하는데 이러한 수고를 없애준다. 

 

그리고, @Resource를 사용하는 이유는 서비스에 있는 특정 메서드를 사용하기 위해서다. 
다른클래스에서 메서드를 사용할 때 인스턴스를 생성한다.  

@Resource이 그 역할을 대신한다.(@Resource이 인스턴스를 생성한다)


@Resource은 룩업하는 과정을 간소하게 한다. 
@Resource은 자바에서 나왔다. 
@Resource와 같은 어노테이션은 @Autowire이다. 
@Autowire는 스프링에서 나왔다
@Autowire보다 @Resource이 더 선호된다.
왜냐하면 스프링은 프레임워크가 바뀌면 @autowire도 바뀌지만 

@Resource는 언어가 바뀌지 않는 이상 안전하기 때문이다.
@Resource의 부모가 자바이기 때문이다. 
(하나의 언어에 수많은 프레임워크가 있고 프레임워크 위에 언어있다.)

 

 

출처  :  한큐에 자바 수강내용

스프링폼태그는 Java에서 유효성검사를 할 때 사용한다.

형태는 마치 <c>와 같다.

스프링폼태그를 사용하는 이유는 데이터바인딩(묶어서) 해서 자동적으로 데이터를 설정하고 검색할 수 있다.

또 에러메세지처리 등도 할 수 있다.

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

사용방법은 jsp header부분에 위에 있는 스프링폼태그 라이브러리를 설정해준다.

<input type="text"/>    ->  <form:input />

<input type="hidden"/>  ->  <form:hidden/>

input태그를 스프링폼태그로 바꿔준다.

그리고 VO(value object)객체를 만들어준다.

public class myVO {

 private String apple;
 private String banana;
 
 public string getApple() {
  	return apple;
 }
 
 public void setApple(string apple) {
 	this.apple = apple;
 }
 
 public string getBanana() {
  	return banana;
 }
 
 public void setBanana(string banana) {
  	this.banana = banana;
 }
 
 public myVO(string apple, String banana) {
    super();
    this.apple=apple;
    this.banana=banana;

 }
 
 
}

 

<form:form>는 커맨드 객체를 가져오려고 하기 때문에 커맨드이름을 적어줘야한다.

스프링폼태그 속성 중 commandName에 사용하려는 객체(VO)의 이름을 적는다.

그러면 VO에 만든 필드와 자동으로 연결이 된다.(매핑이 된다)

<form:form commandName="myVO" />
<form:input path="apple"/> 
<form:input path="banana"/> 

스프링폼태그는 JAVA와 같아서 오타가 나면 실행이 되지 않는다.

VO에 있는 필드명이랑 똑같이 쳐야한다.

 

 

스프링폼태그 속성 중 path는 태그의 id와 name을 대신한다.

<form:input path="my"/>     ->  <input type="text" id="my" name="my"/>

 

 

스프링폼태그에서 라디오 부분은 path가 다르다. 보통은 path에서 id와 name을 다 관여하지만 라디오는 id가 다르다. 

<div>
	<form:radiobutton path="apple"/>
	<label for="apple">사과</label>
</div>


<form:radio>는 id가 다르다.
스프링폼태그를 확인할 때는 개발자도구를 이용한다.
id가 달라진 모습을 볼 수 있다.


<div>
	<input type="radio" id="apple1" name="apple">
	<label for="apple">사과</label>
</div>

 

 

출처 :  한큐의 자바 수강내용

 

+ Recent posts