Spring

스프링 MVC 웹서비스

heejin424 2023. 2. 2. 14:52
728x90

빨간부분은 스프링이 해주고 파란색 부분을 만드는 방법을 배워보기

서비스와 DAO영역은 인터페이스를 이용해서 만든다.

 

흐름 ★\

예시는 데이터를 받아서 화면에 다시 구현하지만
/ 초기화면 - controller - service계층 -  DAO계층 -  service계층 - controller - 요청화면
실제로 사용은 
/ 초기화면 - controller - service계층 - DAO계층 - DB - DAO계층 - service계층 - controller - 결과화면

 

@service 계층구현

Controller의 역할을 나눠주는 역할

예시 1 ) new 연산자를 이용한 service객체 생성 및 참조

더보기

controller

package com.simple.controller;

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

import com.sample.command.ScoreVO;
import com.simple.score.service.ScoreServiceImpl;

@Controller
@RequestMapping("/service")
public class ServiceController {

	//1. 지역변수가 아닌 전역변수로 선언 (재활용 가능)
	ScoreServiceImpl service = new ScoreServiceImpl();
		
	
	//화면출력
	@RequestMapping("/scoreRegist")
	public String registView() {
		return "service/scoreRegist";
	}
	
	//폼요청
	@RequestMapping(value="/regist", method = RequestMethod.POST)
	public String regist( ScoreVO vo ) {
//		값이 잘 들어오는지 확인하기 위해서 출력해본다.
//		System.out.println(vo.toString());
		
//		1.객체생성
		service.regist(vo);		
		
		return null;
	}
}

scoreRegist.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>

	<form action="regist" method="post">
		이름 : <input type="text" name="name">
		영어 : <input type="number" name="kor">
		국어 : <input type="number" name="eng">
		
		<input type="submit" value="등록">
	</form>
</body>
</html>

예시 2)  스프링 설정파일을 이용한 서비스 객체생성 및 의존객체자동주입

@Autowired

더보기

 servlet-context.xml

기존 부분에 아래의 태그 추가

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    
	<!-- 2번째 방법 service영역을 빈으로 설정 -->
	<beans:bean class="com.simple.score.service.ScoreServiceImpl"></beans:bean>
	
</beans:beans>

controller

package com.simple.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.sample.command.ScoreVO;
import com.simple.score.service.ScoreServiceImpl;

@Controller
@RequestMapping("/service")
public class ServiceController {

//	2.service를 bean으로 생성한다. 의존객체 자동주입
	@Autowired
	ScoreServiceImpl service;
	
	//화면출력
	@RequestMapping("/scoreRegist")
	public String registView() {
		return "service/scoreRegist";
	}
	
	//폼요청
	@RequestMapping(value="/regist", method = RequestMethod.POST)
	public String regist( ScoreVO vo ) {

		service.regist(vo);	

		return null;
	}
}

예시 3 ) 어노테이션을 이용해서 서비스 객체 생성 및 의존 객체 자동 주입

3-1)

@service
servlet-context.xml

3-2)

동일한 이름으로 작성해야한다. 보통 멤버변수 명을 따라서 짓는다. 이름대신 service로

3-3) 인터페이스를 사용하기

장점 : 여러개의 구현체를 만들 때 어노테이션의 이름만 변경하면 쉽게 변경할 수 있다.

인터페이스에 추가하고 메서드 오버라이딩해서 추가하고..

인터페이스를 사용하면 메서드의 갯수가 많아졌을 경우 수정이 쉽다.


@ DAO 계층구현

DB의 역할을 나눠주는 역할 (과부화 방지)

jstl문법 사용하기 위해서 jsp파일 위쪽에 넣어야할 태그
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 

전체 예시 )

초기화면 (scoreRegist.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>

	<form action="regist" method="post">
		이름 : <input type="text" name="name">
		영어 : <input type="number" name="kor">
		국어 : <input type="number" name="eng">
		
		<input type="submit" value="등록">
	</form>
</body>
</html>

VO ( ScoreVO.jsva ) - read only 값을 확인하는 기능

더보기
package com.sample.command;

public class ScoreVO {

	private String name;
	private String kor;
	private String eng;
	
	
	public ScoreVO() {
		super();
	}


	public ScoreVO(String name, String kor, String eng) {
		super();
		this.name = name;
		this.kor = kor;
		this.eng = eng;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public String getKor() {
		return kor;
	}


	public void setKor(String kor) {
		this.kor = kor;
	}


	public String getEng() {
		return eng;
	}


	public void setEng(String eng) {
		this.eng = eng;
	}


	@Override
	public String toString() {
		return "ScoreVO [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
	}
	
	
}

Controller ( ServiceController.java )

@Autowired만을 통해 의존성을 주입해도 되지만 @Qualifier("의존성연결이름")를 사용해서 원하는 곳에 연결해도 된다, 하지만 생략 가능하다.

더보기
package com.simple.controller;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.sample.command.ScoreVO;
import com.simple.score.service.ScoreService;
import com.simple.score.service.ScoreServiceImpl;

@Controller
@RequestMapping("/service")
public class ServiceController {

	//1. 지역변수가 아닌 전역변수로 선언 (재활용 가능)
//	ScoreServiceImpl service = new ScoreServiceImpl();
	
//	2.service를 bean으로 생성한다. 의존객체 자동주입
	
	
	//3. @Service로 빈으로 생성하고, 의존객체 자동주입
	@Autowired
	@Qualifier("이름")
	private ScoreService service; //인터페이스 타입 선언
//	ScoreServiceImpl service;
	
	//화면출력
	@RequestMapping("/scoreRegist")
	public String registView() {
		return "service/scoreRegist";
	}
	
	//폼요청
	@RequestMapping(value="/regist", method = RequestMethod.POST)
	public String regist( ScoreVO vo ) {
//		값이 잘 들어오는지 확인하기 위해서 출력해본다.
//		System.out.println(vo.toString());
		
//		1.객체생성
		service.regist(vo);		
		
		return "service/scoreResult";
	}
	
	//목록화면
	@RequestMapping("/scoreList")
	public String scoreList(Model model) {
	
		//data조회
		ArrayList<ScoreVO> list = service.getList();
		model.addAttribute("list", list);
		
		return "service/scoreList";
	}
	
	//삭제요청
	@RequestMapping("/delete")
	public String delete(@RequestParam("num") int num) {
		
		service.delete(num);
		
//		System.out.println(num);
		return "redirect:/service/scoreList";
	}
	
}

Service 계층 ( ScoreService, ScoreServiceImpl )

Controller에서 전역변수로 선언한 인터페이스 타입 변수 참고 (private ScoreService service;)

더보기

인터페이스

package com.simple.score.service;

import java.util.ArrayList;

import com.sample.command.ScoreVO;

public interface ScoreService {

//	service구현제에서 사용할 추상메서드의 모형을 선언
	public void regist( ScoreVO vo );
	public ArrayList<ScoreVO> getList();
	public void delete(int num);
}

상속 구현 메서드

package com.simple.score.service;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import com.sample.command.ScoreVO;
import com.simple.score.dao.ScoreDAO;
//@Service //@Component //@Repository //@Controller
@Service("이름") //빈의 이름 명시
public class ScoreServiceImpl implements ScoreService {

	@Autowired
	@Qualifier("yyy") //생략가능
	private ScoreDAO scoreDAO;
	
	
	public void regist( ScoreVO vo ) {
//		System.out.println(vo.toString());
		scoreDAO.regist(vo);
	}


	@Override
	public ArrayList<ScoreVO> getList() {
		
//		ArrayList<ScoreVO> list = scoreDAO.getList();
//		return list;
		
		return scoreDAO.getList();
	}


	@Override
	public void delete(int num) {
		// TODO Auto-generated method stub
		scoreDAO.delete(num);
		
	}
	
}

DAO 계층 ( ScoreDAO , ScoreDAOImpl )

더보기

인터페이스

package com.simple.score.dao;

import java.util.ArrayList;

import com.sample.command.ScoreVO;

public interface ScoreDAO {

	public void regist(ScoreVO vo);
	public ArrayList<ScoreVO> getList();
	public void delete(int num);
}

상속 구현 메서드

package com.simple.score.dao;

import java.util.ArrayList;

import org.springframework.stereotype.Repository;

import com.sample.command.ScoreVO;

@Repository("yyy") //생략가능
public class ScoreDAOImpl implements ScoreDAO {

	//데이터베이스
	ArrayList<ScoreVO> list = new ArrayList<>();
	
	@Override
	public void regist(ScoreVO vo) {
		// TODO Auto-generated method stub
//		System.out.println("DAO영역: " + vo.toString());
		
		list.add(vo); //insert
		System.out.println(list.toString());
	}

	@Override
	public ArrayList<ScoreVO> getList() {

	
		return list;
	}

	@Override
	public void delete(int num) {
		// TODO Auto-generated method stub
		list.remove(num);
		
	}

}

다시 서비스 계층으로 넘어간 뒤 컨트롤러를 타고 컨트롤러의 리턴에 들어있는 요청페이지로 넘어간다.

요청페이지

더보기

ScoreResult.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>
	<h3>등록되었습니다.</h3>
	<a href="scoreList">목록화면</a>
	<a href="scoreRegist">다시 등록하기</a>
</body>
</html>

ScoreList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h3>목록화면</h3>
	<c:forEach items="${list }" var="article" varStatus="num">
		${num.index }
		${article.name }
		${article.kor }
		${article.eng }
		<a href="delete?num=${num.index }">삭제</a>
		<br/>
	</c:forEach>
</body>
</html>
728x90