🌿컨트롤러 구현
1. Controller 인터페이스 구현
2. @Controller 어노테이션 사용
어노테이션을 사용하는 방식이 편의성이 좋기 때문에 더 많이 사용한다.
🍃@Controller 어노테이션 사용
@Controller
public class Ex03Controller {
}
어노테이션을 사용하는 순간 인터페이스를 선언하는 것과 결과가 같다.
handleRequest는 만들고 싶어서 만들었던 게 아니라 Controller 인터페이스가 만들라고 했기 때문에 만든 것이었다. 하지만 어노테이션을 사용하면 강제로 만들어야 하는 게 없다.
자유로운 요청 형식
@Controller
public class Ex03Controller {
public String test() {
return "";
}
public int sum(int a, int b) {
return a + b;
}
}
요청 메서드(doGet/doPost/handleRequest) 또한 형식이 없기 때문에 만드는 사람 마음대로 만든다.
반환 타입 또한 마음대로 할 수 있지만, 반환 타입은 어느 정도 정해져 있는 편이다.
요청 메서드를 test()에게 주고, sum은 일반 메서드이다. 이때 Spring은 같은 메서드로 알고 있기 때문에 어떤 걸 불러와야 할지 알게 해 주어야 한다.
그래서 메서드를 만드는 것까지는 마음대로 할 수 있지만 handler 메서드를 만들기 위한 최소한의 약속을 지켜야 한다.
@RequestMapping
@Controller
public class Ex03Controller {
@RequestMapping
public String test() {
return "";
}
public int sum(int a, int b) {
return a + b;
}
}
따라서 요청이 들어왔을 때 응답하는 메서드라는 것을 알게 하기 위해서 @RequestMapping 어노테이션을 붙여 주어야 한다.
이제 내부에 업무 코드를 작성하고, JSP를 호출하면 된다.
반환 타입을 문자열로 지정
@Controller
public class Ex03Controller {
//요청(핸들러) 메서드
@RequestMapping
public String test() {
//JSP 호출하기 > ModelAndVIew
//1. ModelAndView 생성
//2. ViewResolver 동작
return "ex03";
}
public int sum(int a, int b) {
return a + b;
}
}
1. ModelAndView 생성
2. ViewResolver 동작
핸들러 메서드에서 "ex03" 문자열을 하나 돌려줄 뿐인데, 이 안에서 위의 작업이 발생한다.
해당 return이 JSP를 찾는 역할까지 하게 된다.
@RequestMapping(value = ".do")
@Controller
@RequestMapping(value = "/ex03.do")
public class Ex03Controller {
//요청(핸들러) 메서드
@RequestMapping
public String test() {
//JSP 호출하기 > ModelAndVIew
//1. ModelAndView 생성
//2. ViewResolver 동작
return "ex03";
}
public int sum(int a, int b) {
return a + b;
}
}
클래스의 @Controller 아래에 @RequestMapping를 하나 더 적는다. 여기에 value를 적을 수 있다.
이는 Servlet 가상 주소에서 @WebServlet(\"/03.do\")를 적었던 것과 같다.
간단하게 업무를 보고 난 다음에 ex03을 돌려주는 것만으로도 호출을 하게 되는 웹 과정이 끝났다.
만약 @RequestMapping를 메서드 위에 두 번 이상 작성하면 Ambiguous mapping found 에러가 발생한다. Get메서드가 하나만 있어야 하기 때문이다.
🌿하나의 Controller와 여러 개의 JSP
Controller 하나와 JSP 하나가 반드시 한 짝이 되어야 한다는 규칙이 없다. 하지만 이 방법은 관리하기 불편하기 때문에 Servlet/JSP에서 하지 않았다.
Spring에서는 하나의 Controller에서 여러 개의 JSP를 불러오는 방법을 권장한다.
여러 개의 경로 연결
package com.test.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
//@RequestMapping(value="/ex04.do")
public class Ex04Controller {
@RequestMapping(value="/ex04.do")
public String ex04() {
return "ex04";
}
@RequestMapping(value="/ex04_1.do")
public String ex04_1() {
return "ex04_1";
}
}
앞서 하나의 Controller에 @RequestMapping을 여러 개 넣으면 에러가 발생한다고 했다. 그래서 주소를 2개 만드는 방법으로 각각의 파일을 부르는 방법을 사용한다.
이때 클래스 아래에 있는 @RequestMapping를 지우고 메서드에서 직접 주소를 호출한다.
위 코드는 하나의 서블릿 안에 doGet을 2개 만든 셈이다. Spring을 사용하면 하나의 Java로도 doGet을 여러 개 만들 수 있으므로 상당 수의 Controller가 생성되는 것을 방지할 수 있다.
이 방법은 현재 사용하고 있는 가장 보편적인 사용법이다.
value 속성 생략
package com.test.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Ex04Controller {
@RequestMapping("/ex04.do")
public String ex04() {
return "ex04";
}
@RequestMapping("/ex04_1.do")
public String ex04_1() {
return "ex04_1";
}
}
value 속성을 지울 수 있지만, 이후에 다른 속성을 추가하기 때문에 되도록 붙이는 것을 권장한다.
🌿게시판 만들기
게시판을 만든다는 가정 하에 컨트롤러를 구현해 보도록 하자.
BoardController.java
package com.test.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class BoardController {
// "/spring/board/list.do"
// "/spring/board/add.do"
// "/spring/board/addok.do"
// "/spring/board/view.do"
// doGet() 역할
@RequestMapping(value="/board/list.do")
public String list() {
//WEB-INF/views/board/list.jsp
return "board/list";
}
// doGet() 역할
@RequestMapping(value="/board/add.do")
public String add() {
return "board/add";
}
// doPost() 역할
@RequestMapping(value="/board/addok.do")
public String addok() {
return "board/addok";
}
// doGet() 역할
@RequestMapping(value="/board/view.do")
public String view() {
return "board/view";
}
}
코드 상에서는 전혀 구분이 되지 않지만, doGet 역할과 doPost 역할을 따로 하고 있다.
Spring에서도 doGet과 doPost 역할을 구분하고 있으나, 생략하고 있기 때문에 구분이 안 되고 있을 뿐이다.
method 속성으로 doGet, doPost 명시
//@RequestMapping(value="/board/list.do")
@RequestMapping(value="/board/list.do", method=RequestMethod.GET)
@RequestMapping(value="/board/addok.do", method=RequestMethod.POST)
doGet과 doPost를 명시하지 않으면 둘 다 할 수 있다.
그런데 기본값은 좋지 않다. 경우의 수가 많으면 헷갈리고, 결국 가독성이 떨어져 발목을 잡게 된다.
그래서 method 속성으로 구분지어서 코딩하는 게 더 좋은 방식이다.
@RequestMapping(value="/board/list.do", method={RequestMethod.GET, RequestMethod.POST})
가끔 Get 방식과 Post 방식 모두 사용해야 하는 경우가 있다. 이때 배열 표현을 사용한다.
중간 경로 변경
현재 중간 경로는 board이다. 이를 다른 경로로 고치고 싶을 때 일일이 수정해야 하므로 오타가 발생할 수 있다.
이때 Class 위에 작성했던 @RequestMapping을 사용한다.
@RequestMapping(value="/board")
public class BoardController {
@RequestMapping(value="/list.do", method={RequestMethod.GET, RequestMethod.POST})
public String list() {
//WEB-INF/views/board/list.jsp
return "board/list";
}
}
상단에 미리 하나 적어 놓으면 나머지 코드에서는 그 외의 부분만을 작성하면 되므로 편리하다.
BoardController.java 완성
package com.test.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(value="/board")
public class BoardController {
// "/spring/board/list.do"
// "/spring/board/add.do"
// "/spring/board/addok.do"
// "/spring/board/view.do"
// doGet() 역할
@RequestMapping(value="/list.do", method={RequestMethod.GET, RequestMethod.POST})
public String list() {
//WEB-INF/views/board/list.jsp
return "board/list";
}
// doGet() 역할
@RequestMapping(value="/add.do", method=RequestMethod.GET)
public String add() {
return "board/add";
}
// doPost() 역할
@RequestMapping(value="/addok.do", method=RequestMethod.POST)
public String addok() {
return "board/addok";
}
// doGet() 역할
@RequestMapping(value="/view.do", method=RequestMethod.GET)
public String view() {
return "board/view";
}
}
결론적으로 위와 같이 코드를 고칠 수 있다.
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- list.jsp -->
<h1>게시판 <small>목록</small></h1>
<div>게시판 목록</div>
<div>
<a href="/spring/board/view.do">제목입니다.</a>
</div>
<div>
<input type="button" value="글쓰기" onclick="location.href='/spring/board/add.do';">
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
</script>
</body>
</html>
add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- add.jsp -->
<h1>게시판 <small>글쓰기</small></h1>
<form method="POST" action="/spring/board/addok.do">
<div>글쓰기 폼</div>
<div>
<input type="submit" value="글쓰기">
</div>
</form>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
</script>
</body>
</html>
addok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- addok.jsp -->
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
alert('글쓰기 완료');
location.href = '/spring/board/list.do';
</script>
</body>
</html>
view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- view.jsp -->
<h1>게시판 <small>상세보기</small></h1>
<div>상세 내용</div>
<div>
<input type="button" value="돌아가기" onclick="location.href='/spring/board/list.do';">
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
</script>
</body>
</html>
🌿데이터 전송과 수신
- Ex05Controller.java
- ex05.jsp
- ex05ok.jsp
데이터 전송을 ex05.jsp에서, 데이터 수신을 ex05ok.jsp에서 구현하도록 하자.
package com.test.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class Ex05Controller {
// @RequestMapping(value="/ex05.do", method=RequestMethod.GET)
// public String ex05() {
//
// return "ex05";
// }
//
// @RequestMapping(value="/ex05ok.do", method=RequestMethod.POST)
// public String ex05ok() {
//
// return "ex05ok";
// }
@GetMapping(value="/ex05.do")
public String ex05() {
return "ex05";
}
@PostMapping(value="/ex05ok.do")
public String ex05ok() {
return "ex05ok";
}
}
Request 메서드를 각각 GET과 POST로 했다.
이것도 반복되기 때문에 어노테이션을 추가로 제공하고 있다.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>spring</artifactId>
<name>BeginTest</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>11</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
....
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
Spring 4.3 이후에 만들어진 기능이므로 이 기능을 사용하려면 pom.xml을 수정해 주어야 한다.
Spring 설정에 대해서는 위 글을 참고한다.
Servlet 방식으로 데이터 수신
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- ex05.jsp -->
<h1>데이터 전송</h1>
<form method="POST" action="/spring/ex05ok.do">
<div><input type="text" name="data"></div>
<div><input type="submit" value="보내기"></div>
</form>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
</script>
</body>
</html>
package com.test.spring.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class Ex05Controller {
@GetMapping(value="/ex05.do")
public String ex05() {
return "ex05";
}
@PostMapping(value="/ex05ok.do")
public String ex05ok(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
//데이터 수신
//Servlet/JSP: req.getParameter(), req.getParameterValues()
String data = req.getParameter("data");
req.setAttribute("data", data);
return "ex05ok";
}
}
request가 없는데 어떻게 데이터를 수신할 수 있을까?
요청 메서드를 내 마음대로 만들면 인자값이 없어 request를 사용할 수 없는 상태이다. 그래서 request와 response를 인자로 만들어 주어야 한다.
세션 객체도 넣으면 알아서 제공해 주며, 인자가 있으면 있는 대로 호출하고, 없으면 없는 대로 호출하도록 Spring 프레임워크가 만들어져 있기 때문에 편리하다.
이제 ok.jsp에서 확인용으로 출력해 보도록 하자.
결과 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- ex05ok.jsp -->
<h1>결과</h1>
<div class="message" title="데이터">
${data}
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
</script>
</body>
</html>
데이터를 전송받고 출력되긴 하나, 이는 오래된 방식이다.
이번에는 Spring 방식으로 데이터를 수신해 보도록 하자.
Spring 방식으로 데이터 수신
@PostMapping(value="/ex05ok.do")
public String ex05ok(@RequestParam(name = "data") String data, Model model) {
//System.out.println(data);
model.addAttribute("data", data);
return "ex05ok";
}
Request를 넣을 매개변수를 하나 만들고 이 매개변수 앞에 어노테이션 하나를 만든다. 여기에 @RequestParam을 붙이고, 매개변수로 name을 준다. 그리고 일종의 데이터를 넣을 상자(dto)로 Model을 넣어 주었다.
이는 req.getParameter를 @RequestParam이라는 표현으로 바꾼 것이다.
어노테이션은 원래 앞에 붙는 건데 가독성을 위해 그동안 위에 붙였던 것이므로 앞에 붙여도 전혀 문제가 없다.
하지만 이 방법은 Spring의 이점을 충분히 살리고 있지 못하다.
@RequestParam 생략
@PostMapping(value="/ex05ok.do")
public String ex05ok(String data, Model model) {
model.addAttribute("data", data);
return "ex05ok";
}
@RequestParam은 생략이 가능하다. 그래서 Model만 추가해 주면 된다.
매개변수만 만드는 것으로 이 작업이 모두 자동으로 이루어진다.
@ModelAttribute
@PostMapping(value="/ex05ok.do")
public String ex05ok(@ModelAttribute(name="data") String data) {
return "ex05ok";
}
@ModelAttribute도 @RequestParam과 동일한 용법으로 사용할 수 있다.
request를 했으면 그 안에 add하고 전달해야 하는데, 그것까지 포함되어 있다.
복합값 수신
복합값을 수신받고 DB에 저장하기까지의 작업을 해보도록 하자.
ex05.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- ex05.jsp -->
<h1>데이터 전송 <small>단일값</small></h1>
<form method="POST" action="/spring/ex05ok.do">
<div><input type="text" name="data"></div>
<div><input type="submit" value="보내기"></div>
</form>
<h1>데이터 전송 <small>복합값</small></h1>
<form method="POST" action="/spring/ex05ok.do">
<div>이름: <input type="text" name="name"></div>
<div>나이: <input type="text" name="age"></div>
<div>주소: <input type="text" name="address"></div>
<div><input type="submit" value="보내기"></div>
<input type="hidden" name="seq" value="5">
</form>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
</script>
</body>
</html>
ex05ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>
</style>
</head>
<body>
<!-- ex05ok.jsp -->
<h1>결과 <small>단일값</small></h1>
<div class="message" title="데이터">
${data}
</div>
<h1>결과 <small>복합값</small></h1>
<div class="message" title="result">
${result}
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
</script>
</body>
</html>
SpringDTO.java
package com.test.spring.domain;
import lombok.Data;
@Data
public class SpringDTO {
private String name;
private String age;
private String address;
}
Ex05Controller.java
package com.test.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.test.spring.domain.SpringDTO;
import com.test.spring.persistence.SpringDAO;
import com.test.spring.persistence.SpringDAOImpl;
@Controller
public class Ex05Controller {
@GetMapping(value="/ex05.do")
public String ex05() {
return "ex05";
}
@PostMapping(value="/ex05ok.do")
public String ex05ok(@RequestParam("name") String name,
@RequestParam("age") String age,
@RequestParam("address") String address,
Model model) {
SpringDTO dto = new SpringDTO();
dto.setName(name);
dto.setAge(age);
dto.setAddress(address);
SpringDAO dao = new SpringDAOImpl();
int result = dao.add(dto);
model.addAttribute("result", result);
return "ex05ok";
}
}
데이터가 3개나 넘어왔다. Request 대신에 RequestParam을 사용했다.
@PostMapping(value="/ex05ok.do")
public String ex05ok(String name,
String age,
String address,
Model model) {
SpringDTO dto = new SpringDTO();
dto.setName(name);
dto.setAge(age);
dto.setAddress(address);
SpringDAO dao = new SpringDAOImpl();
int result = dao.add(dto);
model.addAttribute("result", result);
return "ex05ok";
}
매개변수가 상당히 길다. 장기 프로젝트를 할 때에는 줄인 표현이 좋지 않기 때문에 풀네임을 쓰고, 간단한 테스트를 할 때는 줄여서 사용한다.
🍃DTO를 매개변수로 사용
@PostMapping(value="/ex05ok.do")
public String ex05ok(SpringDTO dto, String seq, Model model) {
SpringDAO dao = new SpringDAOImpl();
int result = dao.add(dto);
model.addAttribute("result", result);
return "ex05ok";
}
DTO를 매개변수를 넣으면 Request를 하지 않고도 사용할 수 있다.
Request 하는 것, DTO 만드는 것, 세팅하는 것까지 모두 생략이 된다.
넘어가는 데이터가 전혀 연관관계가 없는 경우 DTO에 추가하기 애매할 수 있다. 그럴 때는 따로 받도록 한다.
SpringDAO.java
package com.test.spring.persistence;
import com.test.spring.domain.SpringDTO;
public interface SpringDAO {
int add(SpringDTO dto);
}
SpringDAOImpl
package com.test.spring.persistence;
import com.test.spring.domain.SpringDTO;
public class SpringDAOImpl implements SpringDAO {
@Override
public int add(SpringDTO dto) {
//DB > insert 작업
System.out.println("insert 완료");
System.out.println("데이터 확인" + dto);
return 1; //성공
}
}
데이터가 잘 넘어왔는지 확인하기 위해 dto를 출력하고, 작업을 성공했다는 가정 하에 1을 돌려주기로 한다.
result로 1이 잘 출력되는 것을 확인할 수 있다.
다중값 수신
ex05.jsp
<h1>데이터 전송 <small>다중값</small></h1>
<form method="POST" action="/spring/ex05ok.do">
<div><input type="checkbox" name="cb" value="red">빨강</div>
<div><input type="checkbox" name="cb" value="blue">파랑</div>
<div><input type="checkbox" name="cb" value="yellow">노랑</div>
<div><input type="checkbox" name="cb" value="black">검정</div>
<div><input type="checkbox" name="cb" value="green">초록</div>
<div><input type="submit" value="보내기"></div>
</form>
Ex05Controller.java
@PostMapping(value="/ex05ok.do")
public String ex05ok(Model model, @RequestParam("cb") String[] cb) {
System.out.println(Arrays.toString(cb));
return "ex05ok";
}
배열로 받더라도 동일하게 잘 받는 것을 확인할 수 있다.