Spring 실습

Spring 2024-04-22 실습

choco2706 2024. 4. 22. 15:44

예제 1-1)

package kr.or.ddit.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/*
	Controller 어노테이션
	스프링 프레임워크에게 "이 클래스는 웹 브라우저의 요청(request)를 받아들이는 컨트롤러야" 라고 알려주는 것.
	스프링은 servlet-context.xml의 context:component-scan의 설정에 의해
	이 클래스를 자바빈 객체로 등록(메모리에 바인딩).
*/
@Controller
public class BookController {
	//요청URI : /create
    //요청파라미터 : 
    //요청방식 : get
	@RequestMapping(value="/create", method=RequestMethod.GET)
	public ModelAndView create() {
		/*
	       ModelAndView
	       1) Model : Controller가 반환할 데이터(String, int, List, Map, VO..)를 담당
	       2) View : 화면을 담당(뷰(View : JSP)의 경로)
        */
		ModelAndView mav = new ModelAndView();
		
		// 데이터 => name : title, value : 도서 생성
		mav.addObject("title", "도서 생성");
		
		// jsp
//      <beans:property name="prefix" value="/WEB-INF/views/" />
//      <beans:property name="suffix" value=".jsp" />
      // prefix(접두어) : /WEB-INF/views/
      // suffix(접미어) : .jsp
      // /WEB-INF/views/ + book/create + .jsp
      // forwarding
		mav.setViewName("book/create");
		
		return mav;
		
	}
}

@RequestMapping : 특정 uri로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의를 한다.

이때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것

 

value는 요청받을 url을 설정하게 된다.

method는 어떤 요청으로 받을지 정의하게 된다.(GET, POST, PUT, DELETE 등)

 

mav.addObject("title","도서 생성") : 앞에는 key값, 뒤에는 value값을 넣고 mav에 저장한다. 

mav.setViewName("book/create") : 페이지 이동 값(jsp의 경로라고 생각하면 편함)

jsp 파일의 경로

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>책 등록</h1>
<!-- mav.addObject("title","도서 생성") -->
<h5>${title}</h5>
</body>
</html>

 

${title} : title이라는 key값 안에 있는 value("도서 생성")을 불러옴

처리 과정 동작 방식과 결과

 

 

예제 1-2)

package kr.or.ddit.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

// 스프링 프레임워크에게 "이 클래스는 컨트롤러야"라고 알려주기
@Controller
public class LprodController {
	/*
		    요청URI : /lprod/create
		    요청파라미터 : 
		    요청방식 : get
	 */
	@RequestMapping(value="/lprod/create",method=RequestMethod.GET)
	public ModelAndView create() {
		ModelAndView mav = new ModelAndView();
		// 데이터
		mav.addObject("title","상품 분류 등록");
		// jsp
		// /WEB-INF/Views/ + lprod/create + .jsp
		mav.setViewName("lprod/create");
		
		return mav;
	}
}

 

 

mav.addObject("title","상품 분류 등록") : 앞에는 key값, 뒤에는 value값을 넣고 mav에 저장한다. 

mav.setViewName("lprod/create") : 페이지 이동 값

 

실행 결과

/lprod/create.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<!-- mav.addObject("title","상품 분류 생성") -->
<h1>${title}</h1>
</body>
</html>

${title} = title이라는 키에 담긴 value값 불러오기

결과 페이지

 

예제 2)...에 들어가기 전에 BookVO 생성과 lombok 설치

 

 

위 경로에 VO를 만들어주자.

 

pom.xml에 추가하면 lombok 사용 가능한 코드 (단. 사용하면 POJO의 의존성이 커진다.)

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
      <!-- 
         1) 자바빈 클래스(VO)의 getter/setter메소드, toString 자동처리
         2) log.info() 메소드로 sysout대신 로그를 console에 출력
         1. 개요
         메이븐을 사용하게 되면 POM 파일을 다뤄야 합니다. 
         POM은 Project Object Model의 약자인데... 
         pom.xml이라는 파일이 바로 POM 파일이고 이 파일을 통해 dependency라고 부르는 의존성 설정을 하게 됩니다...
         그리고 각 dependency는 scope을 가지고 있어요...
         종류는 compile, runtime, provided 등의 종류가 있지요...
         2. compile
         compile은 컴파일때 필요한 것입니다... 기본값이기 때문에 만일 scope 설정을 안하면 compile이 기본입니다...
         
         3. runtime
         runtime은 런타임때 필요한 것입니다. 컴파일할 때는 필요가 없지만 실행할 때는 필요한 것이지요.
         JDBC 드라이버 같은게 되겠습니다.
         
         4. provided
         provided는 컴파일때 필요하긴 하지만 런타임때는 JDK 혹은 컨테이너가 제공하는 것입니다.
         마지막 패키징 시 포함되지 않음
         서블릿이나 JSP 관련 API 같은거죠. 
         즉 WAS에서 제공하는 servlet-api.jar를 사용하는 경우 (대부분이겠죠) 입니다.
         만약 운영환경에서 servlet-api.jar 중복으로 인한 문제가 발생한다면 꼭 provided로 바꿔주셔야 합니다.
         
         5. test
         test는 조금 특별한데 테스트 코드를 컴파일할때 필요하지만 배포때는 제외가 됩니다. (따라서 굳이 운영 환경에 JUnit 의존성을 삭제할 필요가 없어요)
         easymock, JUnit 같은거죠.
         
         6. system
         system은 provided와 유사하지만 JAR 파일을 직접 사용합니다...
         이 때는 JAR 파일의 위치를 지정하는 systemPath 엘리먼트가 따라와야 해요...
      -->
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.22</version>
          <scope>provided</scope>
      </dependency> 

 

pom.xml을 수정하면 이전에 했던 run as -> maven build를 다시 해주어야 한다.

그 후 폴더 경로 C:\Users\PC-11\.m2\repository\org\projectlombok\lombok\1.18.22로 들어가면

C:\Users\PC-11\.m2\repository\org\projectlombok\lombok\1.18.22

이러한 파일들이 있어야 하고, 이 폴더 내에서 url 창에 cmd를 쳐주면 이 경로에서 명령프롬포트가 실행된다.

프롬포트에 java -jar lombok-1.18.22.jar를 타이핑하고 엔터 (jar 실행)

 

이런 창이 뜨게 된다면 Specify location.. 클릭 후 실행하고 있는 이클립스의 경로를 찾아 들어간 뒤 eclipse.exe 선택 후 install / update를 누르고 종료

(나의 경우 eclipse경로는 C:\eGovFrameDev-3.10.0-64bit\eclipse 안에 eclipse.exe가 있었다.)

 

이클립스 또한 서버를 끄고 껐다가 켜주면 lombok이 설치된 상태로 켜진다.

 

BookVO

이후 VO파일에 가서 @Data를 치고 임포트를 해주면 lombok.Data가 임포트 된다.

예제 2)

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>책 등록</h1>
<!-- mav.addObject("title","도서 생성") -->
<h5>${title}</h5>
<!-- 
요청URI : /crate
요청파라미터 : {title=개똥이의 모험, category=소설, price=12000}
요청방식 : post
-->
<form action="/create" method="post">
	<p>제목 : <input type="text" name="title" required placeholder="타이틀"></p>
	<p>카테고리 : <input type="text" name="category" required placeholder="카테고리"></p>
	<p>가격 : <input type="text" name="price" required placeholder="가격"></p>
	<p>
		<input type="submit" value="저장">
		<input type="submit" value="목록">
	</p>
</form>
</body>
</html>

 

위 코드 실행

제목, 카테고리, 가격을 form으로 감싼 후 /create로 보낸다.

 

/*
	요청URI : /crate
	요청파라미터 : {title=개똥이의 모험, category=소설, price=12000}
	요청방식 : post 
	 */
	@RequestMapping(value="/create", method=RequestMethod.POST)
	public ModelAndView createPost(BookVO bookVO) {
		
		log.info("bookVO : " + bookVO);
		
		ModelAndView mav = new ModelAndView();
		
		// data
		mav.addObject("bookVO", bookVO);
		// jsp / redirect : 새로운 URL 요청
		mav.setViewName("redirect:/create");
		
		
		return mav;
	}

 

BookController에서 받아준다. 위와 경로가 같지만 보내는 방식(get, post)이 달라서 괜찮다.

파라미터로 정보를 담아온 후 log.info를 통해 콘솔창에서 정보를 확인할 수 있다.

 

mav.addObject("BookVO",bookvo); : mav에 BookVO라는 키값으로 bookVO에 담긴 값을 value로써 담는다

mav.setViewName("redirect:/create"); : /create로 리다이렉트(get 방식)한다.

 

이제 books로 가서 데이터를 작성하고 저장버튼을 누르면

데이터 입력
위 작성한 데이터가 이클립스 콘솔창으로 받아와진다

log.info로 인해 데이터가 이클립스의 콘솔창에 띄워지게 된다. 현재는 title, category, price만 입력했기 때문에

이 세 개의 데이터만 받아오고있다.

 

위 설명을 엑셀로 표현하면 이런 식이 된다