TIL/academy

국비 TIL(Today I Learned) 20220802 스프링.... 뭘 배웠는지 몰라서 제목을 뭐라 써야할지도 모르겠다.

토희 2022. 8. 2. 16:23
728x90

파일 경로 잘 모르겠어서 캡쳐해놓음

 

 

 

Model - 데이터를 보관

View - 화면. Jsp

Controller - 조작 Sevlet

 

JSP  모델1 - V + C, M (요즘 안씀, 지금 해봤자 시간낭비래)

JSP 모델2 - V, C, M (요즘 안씀, 지금 해봤자 시간낭비래)

Framework - 모델2 확장  (우리는 이것만 배우는 느낌)

 

Controller에서 한 단계 더 늘어나고,

TestSpring은 안 쓸거고, 강사님이 샘플 배포, 그 샘플만 있으면 웹개발 가능하데

 

메이븐 관련 설정할때 충돌나는경우가 많아서 뭘 갖다써야하는지 몰라서

강사님이 셋팅해서 줌

 

실습 가위바위보 랜덤게임

내풀이

test4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/jquery/jquery-1.12.4.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$(":button").on("click",function(){
		$("#txt").val($(this).val());
		$("#goForm").submit();
	});
	
});
</script>
</head>
<body>
<!-- 각 버튼 클릭시 해당 값을 test5로 전송하여 램덤으로 구한 결과값을 
	  통하여 컴퓨터와의 승무패를 화면에 전송 및 출력
 -->
<form action="test5" id="goForm" method="post">
 	<input type="button" value="Rock" />
 	<input type="button" value="Paper"/>
 	<input type="button" value="Scissors" />
 	<input type="hidden" name="txt" id="txt"/>
 </form>	
 
</body>
</html>

test5.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
사용자가 ${param.txt}를 냈습니다.
${result}
</body>
</html>

강사님 풀이

test6.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/jquery/jquery-1.12.4.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	// id의 경우 무조건 첫번째 것만 해당
	// 복수로 지정할 경우는 다른 형태를 사용
	$("[type='button']").on("click",function(){
		$("#sel").val($(this).attr("no"));
		$("#goForm").submit();
	});
	
});
</script>
</head>
<body>
<!-- 각 버튼 클릭시 해당 값을 test7로 전송하여 램덤으로 구한 결과값을 
	  통하여 컴퓨터와의 승무패를 화면에 전송 및 출력
-->
<form action="test7" id="goForm" method="post">
	<!-- 값 보관용 -->
	<input type="hidden" name="sel" id="sel"/> 
</form>	
 	<input type="button" value="가위" no="0" /> <!-- no는 추가속성임 우리가 넣은거 -->
 	<input type="button" value="바위" no="1" />
 	<input type="button" value="보"  no="2" />
</body>
</html>

test7.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
컴퓨터가 ${com}를 냈습니다
${res}
</body>
</html>

 

TestController.java

package com.spring.test.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

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

@Controller
public class TestController {
	// RequestMapping(value = "주소") : 해당 주소가 들어올 경우 아래 메소드 실행

	@RequestMapping(value = "/test")
	public ModelAndView test(ModelAndView mav) {
		// ModelAndView : 데이터를 보관하며, 뷰 정보나 뷰가 담기는 객체
		// Spring에서 Controller의 메소드 인자는 Spring에서 자동 생성해서 제공한다.
		// -> 우리가 new를 할 필요가 없다, 샘플데이터 만들때 제외 쓸일이 거의 없을거래

		// addObject(키, 값) : Model에 해당 키와 값을 담는다
		// 값으로 담길 수 있는것은 Object이기 때문에 무엇이든 담긴다
		mav.addObject("msg", "Hello");
		// setViewName(값) : 뷰의 정보를(위치 또는 주소)를 보관한다
		mav.setViewName("test/a");

		return mav;
	}

	@RequestMapping(value = "/test2")
	public ModelAndView test2(
			// Controller에서 값 받을때 2개
			// 1. HttpServletRequest : 요청에 대한 정보가 담긴 객체, 내가 필요한 정보 아닌것도 가져올수 있음
			// 요즘은 잘 안쓰고
			HttpServletRequest req,
			// 값만 가져올래! 2. @RequestParam : 넘어오는 값 중 변수명과 이름이 같은 것을 받음
			// 값이 한두개 넘어올때
			@RequestParam String txt,
			// 2의 옵션 @RequestParam(value = 값)
			// RequestParam에서 value옵션의 경우 변수명이 일치하지 않아도
			// value가 넘어오는 키와 같으면 넣어준다
			@RequestParam(value = "txt") String s,
			// 2의 옵션 @RequestParam에 Collection 형태를 제공할 경우
			// 해당 형태에 맞추어 자동으로 값을 집어넣음
			// Map의 경우 키, 값의 형태로 제공되며,
			// List나 배열의 경우 같은 이름으로 여러개가 넘어오면 순자적으로 보관
			// 값 여러개
			@RequestParam HashMap<String, String> m,

			ModelAndView mav) {
		// getParameter(값) : 넘어오는 값 중 키가 지정한 값과 같은 경우 해당 값을 가져옴
		System.out.println(req.getParameter("txt"));
		System.out.println(txt);
		System.out.println(s);
		System.out.println(m.get("txt"));

		mav.setViewName("test/test2");

		return mav;
	}

	@RequestMapping(value = "/gugu")
	public ModelAndView gugu(ModelAndView mav) {

		mav.setViewName("test/gugu");

		return mav;
	}

	@RequestMapping(value = "/gugures")
	public ModelAndView gugures(@RequestParam int txt, ModelAndView mav) {

		String gugu = "";
		for (int i = 2; i <= 9; i++) {
			gugu += txt + "*" + i + "=" + txt * i + "<br/>"; // 화면에 붙일때는 html이기때문에 br로
		}

		mav.addObject("gugu", gugu);
		mav.setViewName("test/gugures");

		return mav;
	}

	@RequestMapping(value = "/test3")
	public ModelAndView test3(ModelAndView mav) {
		List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

		for (int i = 10; i > 0; i--) {
			HashMap<String, String> data = new HashMap<String, String>();
			data.put("no", Integer.toString(i));
			data.put("title", "Test" + i);

			list.add(data);

		}
		mav.addObject("list", list);

		mav.setViewName("test/test3");
		return mav;
	}

	// 내 풀이
	@RequestMapping(value = "/test4")
	public ModelAndView test4(ModelAndView mav) {

		mav.setViewName("test/test4");
		return mav;
	}

	// 내 풀이
	@RequestMapping(value = "/test5")
	public ModelAndView test5(@RequestParam String txt, ModelAndView mav) {
		System.out.println(txt);

		int user = 0;
		if (txt.equals("Scissors")) {
			user = 1;
		} else if (txt.equals("Rock")) {
			user = 2;
		} else if (txt.equals("Paper")) {
			user = 3;
		}

		int com = (int) (Math.random() * 3 + 1);
		String result = "";
		System.out.println(user);
		switch (user) {
		case 1: // 가위
			switch (com) {
			case 1: // 가위
				result = "컴퓨터가 가위를 냈습니다. 비겼습니다.";
				break;
			case 2: // 바위
				result = "컴퓨터가 바위를 냈습니다. 졌습니다.";
				break;
			default: // 보
				result = "컴퓨터가 보를 냈습니다. 이겼습니다.";
				break;
			}
			break;

		case 2: // 바위
			switch (com) {
			case 1: // 가위
				result = "컴퓨터가 가위를 냈습니다. 이겼습니다.";
				break;
			case 2: // 바위
				result = "컴퓨터가 바위를 냈습니다. 비겼습니다.";
				break;
			default: // 보
				result = "컴퓨터가 보를 냈습니다. 졌습니다.";
				break;
			}
			break;

		default: // 보
			switch (com) {
			case 1: // 가위
				result = "컴퓨터가 가위를 냈습니다. 졌습니다.";
				break;
			case 2: // 바위
				result = "컴퓨터가 바위를 냈습니다. 이겼습니다.";
				break;
			default: // 보
				result = "컴퓨터가 보를 냈습니다. 비겼습니다.";
				break;
			}
			break;
		}

		mav.addObject("result", result);
		mav.setViewName("test/test5");

		return mav;
	}

	// 강사님 코드
	@RequestMapping(value = "/test6")
	public ModelAndView test6(ModelAndView mav) {

		mav.setViewName("test/test6");
		return mav;
	}

	// 강사님 코드
	@RequestMapping(value = "/test7")
	public ModelAndView test7(@RequestParam int sel, ModelAndView mav) {
		// 0 - 가위, 1- 바위, 2- 보

		// 랜덤 생성
		int com = (int) Math.floor(Math.random() * 3);
		// 결과
		String res = "";

		if (sel == com) {
			res = "draw";
		} else if ((sel == 0 && com == 2) || (sel == 1 && com == 0) || (sel == 2 && com == 1)) {
			res = "win";
		} else {
			res = "lose";
		}

		// 컴퓨터 보내고 싶을때 근데 내가 버큰 클릭한것도 숫자로 받기때문에 의미가 없음
		switch (com) {
		case 0:
			mav.addObject("com", "가위");
			break;
		case 1:
			mav.addObject("com", "바위");
			break;
		case 2:
			mav.addObject("com", "보");
			break;
		}

		System.out.println(com);
		mav.addObject("res", res);
		mav.setViewName("test/test7");
		return mav;
	}
}

 

 

 

DI(Dependency Injection) : 의존성 주입

스프링이 지금까지 자바쪽 웹 개발 탑 1이 된 이유, 메인이 되는 핵심, 내용 어렵다

=> 미리 생성된 객체들을 필요에 의하여 해당 객체에 접근 할 수 있도록 연결하는 것

 

 

서비스 패키지 만들기

 

인터페이스 만들기

클래스 만들기

@Service 붙이고, 인터페이스 참조

 

 

컨트롤러도 새로 만듬

이렇게 만듬

 

 

 

 

인터페이스 요청했는데 클래스 넘어오는 이유, 위의 사진을 더 자세히보면 아래처럼 

이름을 만들어 놓은게 인터페이스

사람이 클래스

 

인터페이스 이름 삼아서, 사람을 동작하게 하겠다

 

 

단점 로딩할때 시간이 걸림

일단 객체를 다 만들어 놓고, 

 

한번 만들고 나면 필요한 곳에서 쓸수있음

부를수록 객체에 대한 효율이 올라가

그래서 규모가 커질수록 스프링 사용하는 효율이 올라감

 

서버사이드랜더링 같군

 

 

 

1. TestController2에서 메소드 적고, 빨간줄 뜨면 Add~~

2. ITestService에 메소드가 생김, public만 추가해주기, ITestService에 ctrl + 마우스 가지고가면, 구현부로 갈지 참조부로 갈지 결정할수있음

3. 참조부로 가서 메소드 내용 작성

4. jsp그려주면 끝

 

 

 

 

구글 드라이브에서 샘플 파일 다운

 

Finish하면은 새로운 라이브러리를 다운받는중

 

프로젝트에 X가 쳐져 있을거임

프로젝트 우클릭 -> 메이븐 -> 업데이트 프로젝트

 

log4j.xml에 <!DOCTYPE ~~ 부분을 위에처럼 바꿔줌

이클립스 버전에 따라 안 바꿔줄수도 있음

 

 

서버 등록

 

 

 

샘플 스프링 파일 설명

이클립스만 쓸수있음

 

 

 

데이터의 문자 형태를 지정하겠다

 

 

Controller : 주소랑 메소드 연결, View정보 반환

Service: 기능 구현(메소드)

Dao(Data Acess Object) : 외부 저장소에 접근 

 

 

 

회사마다 조금씩 다름, Dao를 Controller에서 할수도 있데

 

 

 

testController2.java

package com.spring.test.controller;

import org.springframework.beans.factory.annotation.Autowired;

@Controller
public class TestController2 {

	// @Autowired : 다음 지정된 객체 의존성 주입 요청
	@Autowired
	public ITestService iTestService; // 인터페이스를 요청했는데 클래스가 넘어와?

	@RequestMapping(value = "/test8")
	public ModelAndView test8(ModelAndView mav) {

		 iTestService.test();

		mav.setViewName("test/test8");
		return mav;
	}
}

lTestService.java

package com.spring.test.service;

public interface ITestService {

	public void test();

}

TestService.java

package com.spring.test.service;

import org.springframework.stereotype.Service;

@Service
public class TestService implements ITestService {

	@Override
	public void test() {
		System.out.println("TestService메소드 호출");

	}

}

test8.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Test8입니다.
</body>
</html>

 

 

 

느낀점

어제는 jsp -> controller -> jsp이렇게 값 주고 받았으면

이제는 service를 하나 더 만들고, 인터페이스를 만들고, 

 

728x90