반응형

💡 Lombok 라이브러리

Lombok 라이브러리는 유용한 어노테이션을 모은 라이브러리입니다.

다음 예제 실습을 위한 몇 가지 롬북 어노테이션을 소개합니다.

//   @Setter : setter 함수를 만들어주는 어노테이션
//   @Getter : getter 함수를 만들어주는 어노테이션
//   @ToString : toString 재정의 함수 자동으로 만들어주는 어노테이션
//   @AllArgsConstructor : 모든 속성을 가진 생성자 자동 정의 어노테이션

먼저 실습을 하기 위해 아래와 같이 폴더를 구성합니다.

com.example.controllerexam 폴더 아래에 model 폴더를 생성합니다.

📂 model > Member.java

package com.example.controllerexam.model;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;


@Setter
@Getter
@ToString
@AllArgsConstructor
public class Member {
//    TODO : 속성, 생성자 함수(getter/setter)
    String id;      // 회원 id
    String name;    // 회원 이름
}

Lombok 어노테이션을 사용함으로써 코드가 간결해집니다.

 

📂 ObjectParamController.java

package com.example.controllerexam.controller.exam04;

import com.example.controllerexam.model.Member;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * packageName : com.example.controllerexam.controller.exam04
 * fileName : ObjectParamController
 * author : GGG
 * date : 2023-10-05
 * description : @ModelAttribute : 객체 형태로 변환하는 어노테이션
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-10-05         GGG          최초 생성
 */
@Controller
@RequestMapping("/exam04")
public class ObjectParamController {
//    TODO : URL TEST ) http://localhost:8000/exam04/object-param?id=junyeoke&name=lee
//     @ModelAttribute : 객체의 속성명으로 jsp로 각각 전달
//     Member 클래스의 속성명 == url의 매개변수명 : id, name
    @GetMapping("/object-param")
    public String getObjectParam(
            @ModelAttribute Member member){
        return "exam04/object_param.jsp";
    }
}

 

 

@ModelAttribute는 사용자가 요청시 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션입니다.

 

📂 object_param.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<%--    TODO : 매개변수 받기 --%>
    <h2>매개변수 받기</h2>
    <p>${member}</p>
</body>
</html>

 

📌 결과출력

반응형
반응형

💡 JSP의 조건문, URL 매개변수에 3개를 전달해서 조건에 따라 출력하기

📂 MultiParamController.java

   TODO : 예제 3) JSP의 조건문, URL 매개변수 3개를 전달해서 조건에 따라 출력하기
//     URL 테스트 : http://localhost:8000/exam03/condition?name=삼식이&color=brown&kind=dog
    @GetMapping("/condition")
    public String setCondition(Model model,
                               @RequestParam(defaultValue = "") String name,
                               @RequestParam(defaultValue = "") String color,
                               @RequestParam(defaultValue = "") String kind)
    {
        model.addAttribute("name", name);
        model.addAttribute("color", color);
        model.addAttribute("kind", kind);
        return "/exam03/condition.jsp";
    }
}

📂 condition.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <h2>매개변수(파라메터) 전달받아 출력하기</h2>
        <p>${name}</p>
        <p>${color}</p>
        <p>${kind}</p>

<%--        TODO : if 조건문으로 출력하기: jstl 표현식, else 없음 사용--%>
<%--         사용법 : <c:if test="${조건식}">실행문</c:if>--%>
        <c:if test="${name == '삼식이'}">
            <p>삼식이가 맞습니다.</p>
        </c:if>
    </div>
</body>
</html>

✅ JSP의 if 조건문

JSP에서 if 조건문을 사용할 경우에는 JSTL 표현식을 사용합니다. 사용법은 아래와 같습니다.

<c:if test="${조건식}> 실행문 </c:if>

단 JSP의 if 조건문은 JAVA에서 처럼 else구문이 따로 없는것이 특징입니다.

 

그럼 else 구문을 사용하려면 어떻게 해야할까요?

 

✅ JSP의 choose 조건문

choose 조건문은 JAVA의 if ~ else if 구문과 비슷합니다.

 

JAVA의 else 구문과 같은 의미인 otherwise가 있습니다.

 

📌 choose 조건문

<%--        TODO : choose 조건문으로 출력하기, else 있음--%>
        <c:choose>
            <c:when test="${color == 'brown'}">
                갈색입니다.
            </c:when>
            <c:when test="${color == 'yellow'}">
                노란색입니다.
            </c:when>
            <c:otherwise>
                다른색입니다.
            </c:otherwise>
        </c:choose>

📌 사용법

// TODO: choose 조건문으로 출력하기 , else 있음

사용법 
<c:choose>
(if, else if): <c:when test="조건문">실행문</c:when>
(else): <c:otherwise>실행문</c:otherwise>
</c:choose>

📌 출력결과

반응형
반응형

💡 ArrayList 형태의 View에서의 출력

📂 MulitParamController.java

@GetMapping("/hello-array")
public String setHelloArray(Model model,
                            @RequestParam(defaultValue = "") String name,
                            @RequestParam(defaultValue = "") String id)
{
    List<String> list = new ArrayList<>();
    list.add(name);
    list.add(id);

    model.addAttribute("list",list);
    return "exam03/hello_array.jsp";
}

setHelloArray 메서드 내에서 문자열 형태의 ArrayList를 생성합니다.

그리고 .add() 를 사용하여 RequestParam의 변수를 넣어줍니다.

 

📂 hello_array.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2>예제 2) URL 매개변수를 ArrayList 로 View에 전달</h2>
    <p>${list}</p>

    <table class="table">
        <thead>
        <tr>
            <th scope="col">id</th>
            <th scope="col">name</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <%--    TODO: JSP 반복문 : jstl 표현식 사용    --%>
<%--                  <c:forEach var="일반변수" items="${배열}">   --%>
            <c:forEach var="data" items="${list}">
                <td>${data}</td>
            </c:forEach>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

내용을 깔끔하게 보이게 하기 위해 부트스트랩의 테이블 소스를 사용하였습니다.

JSP에서의 반복문은 JSTL 표현식을 사용합니다.

<c:forEach var="변수명" items="${배열}">
${변수명}
</c:forEach>

📌 결과

 

📖 연습문제

//  TODO: 연습 2) 연습 1에서 작성한 dno, dname, loc 를 ArrayList 담아서 jsp 전달하세요
//    화면에 출력시 부트스트랩 테이블을 이용해서 출력하세요
//    url : /example02
//    jsp : exam03/example02.jsp
//    url 테스트 : http://localhost:8000/exam03/example02?dno=10&dname=Accounting&loc=NewYork
//    결과 : 테이블 형태로
//    부서번호 : 10
//    부서명 : Accounting
//    위치 : NewYork

 

📂 MulitParamController.java

@GetMapping("/example02")
public String setHelloArray2(Model model,
                             @RequestParam(defaultValue = "")int dno,
                             @RequestParam(defaultValue = "")String dname,
                             @RequestParam(defaultValue = "")String loc
                             )
{
    List<String> list = new ArrayList<>();
    list.add(String.valueOf(dno));
    list.add(dname);
    list.add(loc);

    model.addAttribute("list",list);
    return "exam03/example02.jsp";
}

📂 example02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2> 연습1) URL 매개변수를 ArrayList 로 View에 전달</h2>
    <p>${list}</p>

    <table class="table">
        <thead>
        <tr>
            <th scope="col">부서번호</th>
            <th scope="col">부서명</th>
            <th scope="col">위치</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <%--    TODO: JSP 반복문 : jstl 표현식 사용    --%>
            <%--                  <c:forEach var="일반변수" items="${배열}">   --%>
            <c:forEach var="data" items="${list}">
                <td>${data}</td>
            </c:forEach>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

📌 실행결과

 

//  TODO: 연습 3) 아래 결과를 ArrayList 담아서 jsp 전달하세요
//    화면에 출력시 부트스트랩 테이블을 이용해서 출력하세요
//    url : /example03
//    jsp : exam03/example03.jsp
//    url 테스트 : http://localhost:8000/exam03/example03?eno=7788&ename=Scott&salary=3000&job=Manager
//    결과 : 테이블 형태로
//      사원번호 : 7788
//      사원명 : Scott
//      월급 : 3000
//      직위 : Manager

📂  MulitParamController.java

@GetMapping("/example03")
public String setHelloArray3(Model model,
                             @RequestParam(defaultValue = "")int eno,
                             @RequestParam(defaultValue = "")String ename,
                             @RequestParam(defaultValue = "")int salary,
                             @RequestParam(defaultValue = "")String job
)
{
    List<String> list = new ArrayList<>();
    list.add(String.valueOf(eno));
    list.add(ename);
    list.add(String.valueOf(salary));
    list.add(job);

    model.addAttribute("list",list);
    return "exam03/example03.jsp";
}

📂 example03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2> 연습3) URL 매개변수를 ArrayList 로 View에 전달</h2>
    <p>${list}</p>

    <table class="table">
        <thead>
        <tr>
            <th scope="col">eno</th>
            <th scope="col">ename</th>
            <th scope="col">salary</th>
            <th scope="col">job</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <%--    TODO: JSP 반복문 : jstl 표현식 사용    --%>
            <%--                  <c:forEach var="일반변수" items="${배열}">   --%>
            <c:forEach var="data" items="${list}">
                <td>${data}</td>
            </c:forEach>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

📌 실행결과

반응형

'Spring Boot > 스프링부트 예제' 카테고리의 다른 글

객체 형태로 변환하는 어노테이션  (0) 2023.10.05
JSP의 조건문  (1) 2023.10.05
@RequestMapping, @RequestParam  (1) 2023.10.05
Model  (0) 2023.10.04
Hello SpringBoot!  (0) 2023.10.04
반응형

💡 @RequestParam

쿼리스트링 방식으로 변수에 값을 저장해서 다른 페이지로 전달하는 Annotation 입니다.

  • 파라미터 이름으로 바인딩
  • name 속성이 파라미터 이름으로 사용
사용법 : 함수명(Model model, @RequestParam 자료형 변수명) {}
url?변수명=값 (웹 브라우저 주소창 입력)

📌 코드작성해보기

📂 ParamController.java

@Controller
public class ParamController {

    @GetMapping("/exam02/hello-name")
    public String HelloName(Model model
            ,@RequestParam(defaultValue = "") String name) {
        model.addAttribute("greeting", "안녕하세요 " + name);
        return "exam02/hello.jsp";
    }

}

여기서

@RequestParam(defaultValue = "") String name)

defaultValue 부분은 생략이 가능합니다.

만약 defaultValue 부분을 생략하고 주소창에 값을 넘겨주지 않을 경우 오류가 발생하게 됩니다.

즉, 옵션을 생략할 경우 반드시 값을 넘겨줘야합니다!

  • 위의 코드는 HelloName 메서드에 @RequestParam 어노테이션을 사용하여 name 값이 전달이 안될 경우 빈문자열로 기본값을 설정하였습니다.

 

📂 hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2>매개변수(파라메터) 전달받아 출력하기</h2>
<%--    TODO : el(Experssion language) 표현식 : ${변수명} --%>
    <p>${greeting}</p>
</div>
</body>
</html>

📌 실행결과

기본 값일 경우 위의 코드처럼 빈 문자열로 출력됨

 

웹 페이지 주소창에 url?변수명=값을 넘겨 실행하면 name 변수에 있는 이순신이 출력됩니다.

✅ URL 매개변수를 2개를 각각 키이름으로 전달하기

위의 예제는 매개변수를 1개를 전달하는 방법이였습니다. 이번에는 매개변수 2개를 전달하는 방법에 대해 알아보겠습니다.

📂 MultiParamController.java

@Controller
@RequestMapping("/exam03")
public class MultiParamController {

//    TODO : 예제 1) URL 매개변수 2개를 각각 키이름으로 전달
//     URL TEST ) http://localhost:8000/exam03/hello-name-id?name=junyeok&id=junyeoke
    @GetMapping("/hello-name-id")
    public String setHelloNameId (Model model,
                                  @RequestParam(defaultValue = "")String name,
                                  @RequestParam(defaultValue = "")String id)
    {
        model.addAttribute("attrName","이름 : " + name);
        model.addAttribute("attrId","아이디 : " + id);
        return "exam03/hello_name_id.jsp";
    }
  • setHelloNameId 메서드에 @RequestParam 어노테이션이 두 개 사용된 것을 알 수 있습니다.

📂 example01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2>URL 매개변수를 각각 키이름으로 전달</h2>
    <p>${dno}</p>
    <p>${dname}</p>
    <p>${loc}</p>
</div>
</body>
</html>

 

📌 실행결과

  • URL TEST 주소는 http://localhost:8000/exam03/hello-name-id?name=junyeok&id=junyeoke 이며 매개변수가 2개 이상일 경우 &을 사용하여 입력합니다.

 

💡 @RequestMapping

요청(Request) URL을 어떤 method가 처리할지 mapping 해주는 Annotation 입니다.

즉, 자주쓰는 공통 URL를 생략할수 있게 해주는 어노테이션이라 생각하시면 됩니다.

@RequestMapping("/공통url") : 공통 url을 함수의 url과 합쳐져서 사용됨
예) @RequestMapping("/exam02") + @GetMapping("/hello-name")
=> url : /exam02/hello-name

컨트롤러 클래스 위에 @RequestMapping 어노테이션을 사용합니다.

package com.example.controllerexam.controller.exam02;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/exam02")
public class ParamController {

    @GetMapping("/hello-name")
    public String HelloName(Model model
            ,@RequestParam(defaultValue = "") String name) {
        model.addAttribute("greeting", "안녕하세요 " + name);
        return "exam02/hello.jsp";
    }

....
}

📖 연습문제

//  TODO: 연습 1) url : /exam02/hello-dname
//               jsp : exam02/example01.jsp
//               문제 : dname(Sales)의 값을 url 쿼리스트링으로 전달해서
//                example01.jsp 에 출력해 보세요
//               결과 : 부서명 : Sales

📂 ParamController.java

@GetMapping("/exam02/hello-dname")
public String HelloDname(Model model, @RequestParam(defaultValue = "") String dname) {
    model.addAttribute("greeting", "부서명 : " + dname);
    return "exam02/example01.jsp";
}

📂 example01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2>dname(Sales)의 값을 url 쿼리스트링으로 전달해서 출력하기</h2>
    <%--    TODO : el(Experssion language) 표현식 : ${변수명} --%>
    <p>${greeting}</p>
</div>
</body>
</html>

📌 실행결과

url?dname=Sale 를 추가하면 부서명에 Sales가 출력됩니다.

 

//  TODO: 연습 2) 숫자로 url 매개변수를 전달해서 화면에 출력해 보세요.
//         url : /exam02/hello-no
//         jsp : exam02/example02.jsp
//         결과 : 20

 

📂 ParamController.java

    @GetMapping("/exam02/hello-no")
    public String HelloNo(Model model, @RequestParam(defaultValue = "0") int no) {
        model.addAttribute("greeting", + no);
        return "exam02/example02.jsp";
    }

📂 example02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2>숫자로 url 매개변수를 전달해서 화면에 출력하기</h2>
    <%--    TODO : el(Experssion language) 표현식 : ${변수명} --%>
    <p>${greeting}</p>
</div>
</body>
</html>

📌 실행결과

 

TODO: 연습 1) URL 매개변수로 dno=10, dName=Accounting 받았다. 아래 결과를 화면에 출력하세요.
url : /example01
jsp : exam03/example01.jsp
<결과>
부서번호 : 10
부서명 : Accounting
위치 : NewYork
url 테스트 : http://localhost:8000/exam03/example01?dno=10&dname=Accounting&loc=NewYork

📂 MultiParamController.java

@GetMapping("/example01")
public String setDnoDname (Model model,
                           @RequestParam(defaultValue = "0")int dno,
                           @RequestParam(defaultValue = "")String dname,
                           @RequestParam(defaultValue = "")String loc){
    model.addAttribute("dno","부서번호 : " + dno);
    model.addAttribute("dname","부서명 : " + dname);
    model.addAttribute("loc","위치 : " + loc);
    return "exam03/example01.jsp";
}

📂 example01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2>예제 2번 문제</h2>
    <p>${dno}</p>
    <p>${dname}</p>
    <p>${loc}</p>
</div>
</body>
</html>

📌 실행결과

반응형

'Spring Boot > 스프링부트 예제' 카테고리의 다른 글

객체 형태로 변환하는 어노테이션  (0) 2023.10.05
JSP의 조건문  (1) 2023.10.05
URL 매개변수를 ArrayList 형태로 View에 전달  (0) 2023.10.05
Model  (0) 2023.10.04
Hello SpringBoot!  (0) 2023.10.04
반응형

💡 모델을 통해 변수 등록하는 방법

모델은 컨트롤러의 메서드에서 매개변수로 받아옵니다. 모델에서 변수를 등록할 때는 addAttribute() 메서드를 사용합니다.

model.addAttribute("변수명", 변숫값);

📂 HelloController.java

package com.example.controllerexam.controller.exam01;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * packageName : com.example.controllerexam.controller.exam01
 * fileName : HelloController
 * author : GGG
 * date : 2023-10-04
 * description : JSP, 타임리프  : SSR  (Server Side Rendering)
 *                   1) 구조 => Springboot 소스가 같이 있음
 *                   2) html 파일을 Springboot에서 만들어서 웹브라우저로 전송함
 *               React / Vue  : CSR  (Client Side Rendering)
 *                   1) 구조 => 소스가 분리됨
 *                   2) html 파일을 최초 1회 전송하고
 *                     => 다음부터는 변경되는 부분만 서버에서 받고, 나머지는 웹 브라우저에서 자체 만듦
 *               @GetMapping("url")함수(){ return "jsp페이지명"; }
 *               => CRUD => Read 요청일때 사용하는 어노테이션
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-10-04         GGG          최초 생성
 */
// TODO 1) @Controller 붙이기
@Controller
public class HelloController {
    @GetMapping("/exam01/hello")
    public String Hello(Model model){
//     TODO: 해쉬맵 자료구조 : (키, 값) => jsp 페이지로 변수를(greeting, greeting2 ...) 전송
        model.addAttribute("greeting","안녕 Springboot");
        model.addAttribute("greeting2","Springboot 처음이지");
        model.addAttribute("greeting3","수고해!!!");

        return "exam01/hello.jsp";
    }
}

💡 JSP의  el (Expression Language) 표현식

el(Expression Language) 표현식은 자바 Spring에서 전송한(Model) 키 값을 출력할 수 있습니다.

${변수명}

 

📂 hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
<%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<%-- jsp 주석 --%>
<%-- TODO: el(Expression Language) 표현식 : ${변수명} --%>
<%--        자바 Spring에서 전송한(Model) 키 값을 출력할 수 있음--%>
    <p>${greeting}</p>
    <p>${greeting2}</p>
    <p>${greeting3}</p>

<%-- TODO: JSTL 표현식(참고) : <c:out value="${변수명}" /> --%>
    <p><c:out value="${greeting}" /></p>
</body>
</html>

 

📌 실행결과

💡 JSP 페이지로 모든 자료형을 보내기

//    TODO: 예제 2) JSP 페이지로 모든 자료형을 보내기
//         url : /exam01/operation
//         jsp : exam01/operation.jsp

✅ JSP에서 JAVA 문법과 같이 사칙연산 / 논리합(곱) / 비교연산자 / 삼항연산자 사용가능!

TODO: 문자열로 생긴 숫자는 자동으로 형변환 됨 (사칙연산시)
JSP : Java Server Page, 자바 문법 모두 사용가능
JSP(.jsp) -> servlet(.java)--%>

 

📂 HelloController.java

@GetMapping("/exam01/operation")
public String Operation(Model model) {

    String strNum = "10";
    int iNum = 100;
    String strVal = "a";
    boolean bVal = true;

    model.addAttribute("strNum",strNum);
    model.addAttribute("iNum",iNum);
    model.addAttribute("strVal",strVal);
    model.addAttribute("bVal",bVal);


    return "exam01/operation.jsp";
}

📂 operation.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--bootstrap css cdn--%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<%--TODO: spring에서 전송한 값으로 사칙연산, 논리연산 해보기--%>
<div class="container p-3">
    <h2>산술연산자</h2>
    <div class="ms-3 mt-3">
<%--   TODO: 문자열로 생긴 숫자는 자동으로 형변환 됨 (사칙연산시)    --%>
<%--    JSP : Java Server Page, 자바 문법 모두 사용가능 --%>
<%--    JSP(.jsp) -> servlet(.java)--%>
        <p>덧셈 : ${strNum + 10}</p>
        <p>뺄셈 : ${strNum - 10}</p>
        <p>곱셈 : ${strNum * 10}</p>
        <p>나눗셈 : ${strNum / 10}</p>
        <p>나머지 : ${strNum % 10}</p>

        <p>숫자 연산 : ${iNum + 10}</p>

        <p>논리 합 : ${bVal || false}</p>
        <p>논리 곱 : ${bVal && false}</p>

        <p>같음 : ${iNum == 100}</p>
        <p>같지않음 : ${iNum != 100}</p>
        <p>보다큼 : ${iNum >= 100}</p>
        <p>보다작음 : ${iNum <= 100}</p>

        <p>조건(삼항) : ${(iNum == 100)? "100임" : "100이 아님"}</p>
<%--    TODO : empty(빈) : 변수의 값이 비었으면(null, 0, "") true, 아니면 false --%>
        <p>empty : ${empty iNum}</p>
        <p>not empty : ${not empty iNum}</p>
    </div>
</div>


</body>
</html>

📌 실행결과

📖 연습문제

//  TODO: 연습 1) url : /exam01/hello2 => "exam01/example01.jsp" 에 "안녕 hello2 페이지 " 출력하기
//                                                                 "Springboot 처음이지"
//                                                                 "수고해!!!"

 

📂 HelloController.java

package com.example.controllerexam.controller.exam01;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;


// TODO 1) @Controller 붙이기
@Controller
public class HelloController {
 
//  TODO: 연습 1) url : /exam01/hello2 => "exam01/example01.jsp" 에 "안녕 hello2 페이지 " 출력하기
//                                                                 "Springboot 처음이지"
//                                                                 "수고해!!!"

    @GetMapping("/exam01/hello2")
    public String Hello2(Model model){
        model.addAttribute("greeting", "안녕 hello2 페이지");
        model.addAttribute("greeting2", "Springboot 처음이지");
        model.addAttribute("greeting3", "수고해!!!");

        return "exam01/example01.jsp";
    }

}

📂 example01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <%--    TODO 부트스트랩 CSS CDN --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<%-- jsp 주석 --%>
<%-- TODO: el(Expression Language) 표현식 : ${변수명} --%>
<%--        자바 Spring에서 전송한(Model) 키 값을 출력할 수 있음--%>
<p>${greeting}</p>
<p>${greeting2}</p>
<p>${greeting3}</p>


</body>
</html>

📌 실행결과

반응형
반응형

❓ 스프링부트?

스프링부트(Spring Boot)는 자바의 웹 프레임워크로 기존 스프링 프레임워크(Spring Framework)에 톰캣 서버를 내장하고 여러 편의 기능들을 추가하여 꾸준한 인기를 누리고 있는 프레임워크입니다.


 

스프링부트 프로젝트를 생성하는 방법에는 두 가지가 있습니다.

  1. spring initializr 사이트를 이용하여 생성 방법
  2. 인텔리제이에서 생성하는 방법 (인텔리제이 무료버전은 프로젝트 기능이 없습니다.)

💡 spring initializr를 이용한 방법

https://start.spring.io/ 이곳에 접속합니다. 또는 구글에서 spring initalizr를 검색하여 첫 번째 사이트에 접속하시면 됩니다.

 

사이트 메인화면

 

 

  • 프로젝트는 Gradle-Groovy 선택
  • Language는 Java 선택
  • Spring Boot는 2.7.16 버전 선택 -> jdk 11버전과 호환성이 좋음 // 최신 버전이면 3.x.x 버전을 선택하시면 됩니다.
  • Artifact 이 부분만 수정하면 됩니다.
  • Packaging은 War 선택
  • Java는 jdk 버전에 따라 선택해주시면 됩니다.

💡 스프링부트 라이브러리 추가

주로 사용하는 라이브러리 입니다. 그 외에는 프로젝트를 진행하면서 추가할 수 있습니다.

 

라이브러리를 추가하면 오른편에 세 가지가 추가된 것을 볼 수 있습니다.

generate 버튼을 누르면 압축파일로 다운로드가 됩니다.

 

다운받은 압축파일을 작업 폴더에 풀어주신후 인텔리제이로 프로젝트를 열어줍니다.

인텔리제이 내에서 다운로드가 실행됩니다. (시간 소요)

 

💡 프로젝트 구성

HelloworldApplication 은 메인함수가 있는 실행 클래스입니다.

 

💡 JSP 라이브러리 추가

✅ build.gradle 추가

스프링부트에서 JSP 라이브러리 추가 지원이 종료되어 수작업으로 라이브러리를 추가해주어야 합니다.

build.gradle를 찾아 더블클릭합니다.
dpendencies 부분에 라이브러리를 수작업으로 추가해줍니다.

dependencies {
    //    jsp 라이브러리 추가
    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' // 추가
    implementation 'javax.servlet:jstl' // 추가

    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

그림에 표시된 아이콘을 눌러야 라이브러리 추가가 완료됩니다.

 

💡 MVC 디자인 패턴을 이용한 Java 코딩

설정파일을 담을 config 폴더와 MVC 디자인 패턴중 C인 controller 부분을 만들 폴더를 생성합니다. 

컨트롤러는 일종의 tv리모컨 역할을 한다고 생각하면됩니다.

 

✅ JSP를 위한 설정파일

JSP를 위한 설정파일을 생성합니다.

설정파일은 config 폴더에 생성합니다.

package com.example.helloworld.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * packageName : com.example.HelloSpringBoot.config
 * fileName : WebMvcConfig
 * author : kangtaegyung
 * date : 2023/07/29
 * description : JSP 설정 파일
 * 요약 :
 *      @Configuration : 어노테이션, 자바파일에 환경설정 기능 부여
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023/07/29         kangtaegyung          최초 생성
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
}

 

✅ controller 만들기

실습을 위한 HelloWorldController 파일을 생성합니다.

파일은 controller 폴더에 생성합니다.

 

✔ Controller 어노테이션 추가

클래스 위에 @Controller 어노테이션을 추가해줍니다.

@Controller
public class HelloWorldController {

    @GetMapping("/exam00/hello")
    public String Hello(Model model){

        return "/exam00/hello.jsp";
    }
}

 

✅ 프로퍼티파일에 환경설정 값 추가

한글깨짐 방지를 위해 파일 인코딩을 UTF-8로 설정합니다.
프로퍼티 파일안에 아래의 코드를 입력합니다.

# 서버 포트
server.port=8000
# jsp 파일 경로
spring.mvc.view.prefix=/WEB-INF/views/
# jsp 파일 확장자 정의
#spring.mvc.view.suffix=.jsp
# 자바 소스 수정시 자동 재시작
spring.devtools.restart.enabled=true

 

✅ view 만들기

뷰를 만들기위해 파일경로를 지정해줍니다.

 

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    Hello.jsp
</body>
</html>

 

✅ 실행

HelloWorldApplication 클래스에서 실행을 합니다.

 

웹 페이지에서 http://localhost:8000 에 접속합니다.

HelloWorldController 클래스에 있는 주소를 복사하고

 http://localhost:8000/exam00/hello 를 입력합니다.

Hello.jsp 파일을 불러온 상태

 

💡 인텔리제이에서 스프링 부트 프로젝트 생성하기

1) 인텔리제이에서 새 프로젝트를 눌러줍니다.

 

2) 새 프로젝트에서 이름을 지정하고 경로를 적절한 위치에 지정 하고 JDK는 11버전 Java도 11버전

패키지 생성은 War 파일로 지정하고 다음을 눌러줍니다.

 

3) dpendencies를 지정해줍니다. 스프링부트 버전은 2.7.16 으로 라이브러리는 사진과 같이 3개만 체크하고 생성합니다.

 

프로젝트 생성이 완료된 상태

✅ UTF-8 설정 : 한글 깨짐 방지

 

✅ 기타 설정


📖 요약

# SpringBoot 프로젝트 생성
1) 웹 제작(Spring initializer) : http://start.spring.io
    - Project 빌드        : Gradle - Groovy
    - spring boot 버전    : 2.7.16 선택
    - spring Metadata    : Artifact : 프로젝트 명 넣기 (예: helloworld)
    - Packaging          : War 선택
    - Java               : jdk 11 선택
    - (오른쪽 화면) Dependencies : ADD Dependencies 버튼 클릭 : 라이브러리 추가
      (1) Spring Boot DevTools
      (2) Lombok
      (3) Spring Web
    - GENERATE 버튼 클릭 : zip 압축된 spring 프로젝트 파일 다운로드 됨

2) 인텔리제이 Ultimate(상용버전) : 위의 기능이 내장되어 있음
    - 이름 : 프로젝트명 넣기 (예 : helloworld)
    - 나머지는 위와 동일 Dependencies는 체크하기

# SpringBoot 환경 설정
1) 인텔리제이 툴 설정 : 에디터 - 파일 인코딩 - (우측화면) 프로퍼티 파일 인코딩 : UTF-8
                                         명확한 Native에서 ASCII로 변환(체크!)
2)                    빌드, 실행, 배포 - 컴파일러 - (우측화면) 프로젝트 자동빌드(체크)
3)                    고급설정 - (우측화면) 컴파일러 - 개발된 애플리케이션이 현재... (체크)

스프링부트 프로젝트의 구조

✅ build.gradle jsp 라이브러리 추가

dependencies {
    //   TODO : jsp 라이브러리 추가 : 오른편 상단에 새로 생기는 아이콘 클릭!
    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' // 추가
    implementation 'javax.servlet:jstl' // 추가

✅ application.properties : 스프링의 환경을 설정하는 파일

# TODO : 스프링의 환경을 설정하는 파일
# 서버 포트 : 스프링의 기본포트 (8080) -> 8000(변경)
server.port=8000
# jsp 파일 경로 지정 : jsp 폴더 경로 추가
spring.mvc.view.prefix=/WEB-INF/views/
# jsp 파일 확장자를 자동으로 붙여주는 기능 : 컨트롤러 : url -> 연결될 jsp : hello.jsp (확장자 자동으로 붙여줌) 
#spring.mvc.view.suffix=.jsp
# 자바 소스가 수정되면 서버 자동 재시작을 함
spring.devtools.restart.enabled=true

✅ Java 폴더 -> ControllerExamApplication : 스프링부트 실행 파일

 

✅ config 폴더 -> WebMvcConfig : JSP를 사용하기 위한 설정 파일

package com.example.controllerexam.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * packageName : com.example.HelloSpringBoot.config
 * fileName : WebMvcConfig
 * author : kangtaegyung
 * date : 2023/07/29
 * description : JSP를 사용하기 위한 설정 파일
 * 요약 :
 *      @Configuration : 어노테이션, 자바파일에 환경설정 기능 부여
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023/07/29         kangtaegyung          최초 생성
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
}

✅ controller 폴더 -> HelloWorldController 파일 : url에 해당하는 jsp 파일로 연결해주는 파일

package com.example.controllerexam.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * packageName : com.example.helloworld.controller
 * fileName : HelloWorldController
 * author : GGG
 * date : 2023-10-04
 * description : Hello World Controller
 * 요약 :
 *      url에 해당하는 jsp 파일로 연결하기
 *      @명칭 : 자바의 어노테이션이라고 하고, 주로 함수/클래스/변수 위에 붙여서 사용힘
 *       작은 기능이 함수에 추가됨
 *       목적 : 사용하면 코딩량이 획기적으로 줄어듦
 *      @Controller : 클래스에 컨트롤러 기능을 부여하는 어노테이션
 *      @GetMapping("url")함수() { return "jsp페이지명"; }
 *      => url이 웹브라우저 주소창에 입력되면 -> jsp 페이지가 화면에 출력됨
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-10-04         GGG          최초 생성
 */
@Controller
public class HelloWorldController {

    @GetMapping("/exam00/hello")
    public String Hello(Model model){

        return "/exam00/hello.jsp";
    }
}

📖 연습문제

//    TODO : 연습) url : "/exam00/hello2"
//             => jsp : "/exam00/example01.jsp"
화면에 Hello JSP & Spring boot 출력해보세요!

📌 example01.jsp

<%-- 아래 page 지시자가 있어야 함 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    Hello JSP & Spring boot
</body>
</html>

📌 HelloWorldController.java

@Controller
public class HelloWorldController {
//    TODO : 연습) url : "/exam00/hello2"
//             => jsp : "/exam00/example01.jsp" : 화면에 Hello JSP & Spring boot 출력

    @GetMapping("/exam00/hello2")
    public String Hello2(Model model){

        return "/exam00/example01.jsp";
    }
}

📌 ControllerExamApplication 파일에서 실행

 

📌 http://localhost:8000/exam00/hello2 접속

 

📌 실행결과

반응형

'Spring Boot > 스프링부트 예제' 카테고리의 다른 글

객체 형태로 변환하는 어노테이션  (0) 2023.10.05
JSP의 조건문  (1) 2023.10.05
URL 매개변수를 ArrayList 형태로 View에 전달  (0) 2023.10.05
@RequestMapping, @RequestParam  (1) 2023.10.05
Model  (0) 2023.10.04
반응형

📖 다음 Java 프로그램의 실행결과는?

class Ref {
	int a;
    Ref(int x) {
    	a = x;
    }
    int sum(Ref obj) {
    	int k;
        k = obj.a - a;
        a = 10; obj.a = 20;
        return k;
    }
}

class PassRef {
	public static void main(String[] args) {
    	Ref obj1 = new Ref(3);
        Ref obj2 = new Ref(4);
        int k1 = obj2.sum(obj1);
        System.out.print(" k1= "+k1);
        System.out.print(" obj1.a= "+obj1.a);
        System.out.print(" obj2.a= "+obj2.a);
    }
}

 

💡 풀이

먼저 PassRef 클래스의 메인 함수 영역을 살핍니다.

Ref 형태의 obj1을 생성하였습니다.

생성자에 매개변수 3이 들어가 있어 위의 Ref 클래스에서 매개변수가 int인 생성자를 따라갑니다.

obj1에는 a 라는 변수에 3이 들어가 있습니다.

 

두번째 obj2를 생성하고 a에는 4가 들어가 있습니다.

 

k1 변수에는 obj2의 sum 함수를 실행합니다. 매개변수는 obj1이 들어가 있습니다.

 

sum 함수를 살펴보면

 

k라는 변수가 생성되고 k 변수에는 obj.a 에서 a를 뺀 값을 저장합니다.

 

여기서 obj.a는 obj1의 a 값을 의미합니다.

 

그리고 a는 obj2의 a 값을 의미합니다.

 

그래서 k 변수에는 3 - 4 인  -1이 저장됩니다.

 

그리고 아래 코드에서 변수 a의 값을 10으로 변경하는데 여기서 a는 obj2의 a를 의미합니다.

 

그리고 obj.a = 20의 의미는 obj1의 a 값에 20을 넣어라는 의미입니다.

 

그리고 return 값으로 k의 값인 -1이 리턴됩니다.

 

즉 k1 변수에는 -1이 저장됩니다.

 

출력은 다음과 같이 출력됩니다.

System.out.print(" k1= "+k1);
System.out.print(" obj1.a= "+obj1.a);
System.out.print(" obj2.a= "+obj2.a);

k1= -1 obj1.a = 20 obj2.a = 10

반응형

'Java > Java 연습문제' 카테고리의 다른 글

자료구조 연습문제 2  (0) 2023.09.26
자료구조 연습문제  (0) 2023.09.26
이름 붙은 반복문 심화예제  (0) 2023.08.12
이름 붙은 반복문  (0) 2023.08.12
break문과 continue 문 예제  (0) 2023.08.12
반응형

❓ 스레드(Thread)란 무엇일까?

동작하고 있는 프로그램을 프로세스(Process)라고 합니다. 보통 1개의 프로세스는 한 가지의 일을 하지만, 스레드(thread)를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 할 수 있습니다.

*         프로세스  : 실행중인 프로그램
*         쓰레드   : 프로세스 안에 여러가지 작업들을 의미, 동시 실행 가능(병렬처리)
*         생성방법 ) 1) 인터페이스 상속 이용
*                    2) 부모 클래스 상속 이용

간단한 예제를 통해 스레드를 구현해보겠습니다.

 

💡 Runnable 인터페이스 상속을 이용한 스레드 구현

public class BeepTask implements Runnable{
    // TODO : 메서드 구현
    //  쓰레드 작업을 실행시키는 함수
    @Override
    public void run() {
        // TODO : 예제 : 삐소리를 들려 주는 코딩
        //  멀티미디어 객체 가져오기
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        for (int i = 0; i < 5; i++) {
            toolkit.beep(); // 컴퓨터 삐소리
            try {
                // 공유 함수
                Thread.sleep(500); // 0.5초 지연 후 삐 소리
            } catch (Exception e) {

            }
        }
    }
}

위의 예제는 스레드 작업 실행 시 윈도우 사운드인 비프음을 들려주는 코드입니다.

 

뒤에서 나올 예제에서 스레드 객체를 만들 때 스레드 클래스를 상속하여 만들기도 하지만 주로 Runnable 인터페이스를 사용합니다.

 

왜냐하면 스레드 클래스를 상속하면 스레드 클래스를 상속한 클래스가 다른 클래스를 상속할 수 없기 때문입니다.

 

위의 BeepTask 클래스는 Runnable 인터페이스를 사용하였습니다.

 

* description : 작업쓰레드 #1 : 삐소리
*               main 함수 : 메인 쓰레드 : 화면출력 : 띵 글자 5번 출력
*               동시 실행
public class BeepTaskApplication {
    public static void main(String[] args) {
//        TODO : 1) 작업쓰레드 객체 생성
        Runnable runnable = new BeepTask(); // 다형성
//        TODO : 2) 쓰레드 생성자의 매개변수로 전달
        Thread thread = new Thread(runnable);
//        TODO : 3) 작업쓰레드 # 1 : 삐소리 실행(run() 실행됨)
        thread.start();

//        TODO : 4) 메인쓰레드 : 화면에 띵 글자 출력
        for (int i = 0; i < 5; i++) {
            System.out.println("띵");
            try {
                Thread.sleep(500); // 0.5 지연
            } catch (Exception e){}
        }
    }
}

위의 BeepTaskApplication 클래스는 실행함수입니다.

 

메인 함수에서 다형성을 이용해 runnable 형태의 BeepTask 객체를 생성해주고,

 

스레드의 생성자(thread)의 매개변수로 runnable를 전달해줍니다.

 

그리고 작업스레드 #1을 실행하는 start함수를 이용해 실행시킵니다.

 

그리고 화면에 출력하기 위해 for 반복문을 사용하여 화면에 출력합니다. 여기서 예외처리를 통해 sleep 함수를 사용해 0.5초 지연을 시켜줍니다.

 

실행결과는 다음과 같습니다.

0.5초씩 지연되며 윈도우 비프음이 실행되며 '띵'이라는 글자가 출력됩니다.





 

💡 Thread 클래스를 상속받아 스레드 구현

다음은 thread 클래스를 상속받아 스레드를 구현해보겠습니다.

public class BeepThread extends Thread{
//    TODO : 쓰레드 작업을 실행시키는 함수
    @Override
    public void run() {
//         TODO: beep 를 들려주는 코드
//            자바쪽 멀티미디어 객체 : 소리, 그림, 이미지 등등 다루는 객체
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        for (int i = 0; i < 5; i++) {
            toolkit.beep(); // 삐소리
            try {
                Thread.sleep(500); // 0.5 삐소리 지연
            } catch (Exception e) {}
        }
    }
}

위의 BeepThread 클래스는 Thread 클래스를 상속받은 형태입니다.

 

run() 함수는 부모 클래스인 Thread 클래스의 run() 함수를 오버라이딩 하였습니다.

 

여기서 Toolkit은 JAVA 멀티미디어를 다루는 객체를 말합니다.

 

아래에 반복문을 통해 toolkit의 함수인 beep() 를 사용하여 윈도우 비프음을 실행시키고

 

예외처리를 통해 0.5초 지연을 해줍니다.

 

public class BeepThreadApplication {
    public static void main(String[] args) {
//        TODO : 1) 쓰레드 객체 생성
        Thread thread = new BeepThread();   // 다형성
//        TODO : 2) 쓰레드 실행 #1 : 내부적으로 run() 함수가 실행됨
        thread.start();
//        TODO : 3) main 쓰레드 작업 #2 : 화면 출력 (띵 * 5 출력)
        for (int i = 0; i < 5; i++) {
            System.out.println("띵");
            try {
                Thread.sleep(500); // 0.5초 지연
            }catch (Exception e){}
        }
    }
}

위의 코드는 상속받은 스레드를 실행하는 클래스입니다.

 

먼저 메인 함수에서 스레드 객체를 생성해주고,

 

스레드 #1를 실행합니다.

 

그리고 for 반복문을 통해 화면에 출력해줍니다.

 

실행결과는 다음과 같습니다.

띵 // 윈도우 비프음과 동시에 실행됨

띵 // 윈도우 비프음과 동시에 실행됨

띵 // 윈도우 비프음과 동시에 실행됨

띵 // 윈도우 비프음과 동시에 실행됨

띵 // 윈도우 비프음과 동시에 실행됨

 


💡 요약

Thread 객체의 생성자로 Runnable 인터페이스를 구현한 객체를 전달하는 방법을 사용하면 Thread 클래스를 상속받아 구현한 것과 동일하게 작동합니다.

thread 객체가 Thread 클래스를 상속했을 경우에는 다른 클래스를 상속받을 수 없지만, 인터페이스를 사용한 경우에는 다른 클래스 상속이 가능하므로 좀 더 유연한 프로그램으로 만들 수 있습니다.


📖 Reference

반응형

'Java > Java 이론' 카테고리의 다른 글

[JSP] JSP 라이프사이클  (0) 2024.07.03
[JSP] Java Server Pages 란?  (0) 2024.07.03
중첩 클래스  (0) 2023.10.02
람다 함수  (0) 2023.10.02
파일 클래스를 이용한 파일 출력  (0) 2023.10.02
반응형

중첩 클래스 정의

* description : 특수클래스 -> 중첩 클래스 : 클래스안에 클래스
* 요약 :
* 클래스의 3요소 : 속성, 생성자, 함수
* 멤버 클래스 - 일반 속성 클래스 : 외부 클래스를 생성해야 내부 클래스를 사용가능
*             정적 속성 클래스 : 외부 클래스 생성없이 바로 사용 가능
* 로컬 클래스 - 함수(메소드) 안의 클래스 : 함수를 실행해야 사용 가능
public class Outer {
    // TODO : 클래스의 3요소 = 속성, 생성자, 함수
    // 생성자
    public Outer() {
        System.out.println("외부 클래스가 생성됨");
    }

    // TODO : 일반 속성 (내부)클래스
    public class Attr {
        //        생성자
        public Attr() {
            System.out.println("Attr 내부 클래스가 생성됨");
        }

        int field1;     // 속성

        void method1() {
        }
    }

    // TODO : 정적 속성(내부) 클래스
    static class Share {
        // 생성자
        public Share() {
            System.out.println("Share 정적 객체가 생성됨");
        }
        int filed1; // 일반 속성
        static int field2; // 정적 속성
        void method1(){};   // 일반 함수
        static void method2(){
            System.out.println("정작함수가 실행됨");
        };   // 정적 함수
    }
    
    // TODO : 로컬 클래스 : 함수 안의 클래스
    void method(){
        // TODO : 내부 클래스
        class Local{
            // 생성자
            public Local() {
                System.out.println("Local 객체가 생성됨");
            }
            int field1; // 속성
            void method1(){};   // 함수
        }
        // Local 객체 생성
        Local local = new Local();
        local.field1 = 3;       // 내부클래스 속성
        local.method1();        // 내부클래스 함수
    }
}

중첩클래스의 사용

public class OuterApplication {
    public static void main(String[] args) {
//        TODO : 외부클래스 : Outer 객체 생성
        Outer outer = new Outer();

//        TODO : 1) 일반 속성 내부 클래스 객체 생성
//         사용법 : 외부클래스.내부클래스 객체변수 = 외부객체.new 내부생성자함수();
        Outer.Attr attr = outer.new Attr();
        attr.field1 = 3;    // 내부 클래스의 속성
        attr.method1();     // 내부 클래스의 함수

//        TODO : 2) 정적(공유) 속성 내부 클래스 객체 생성 없음 : 바로 호출
//         사용법 : 외부클래스.내부클래스.속성, 외부클래스.내부클래스.함수()
        Outer.Share.field2 = 3;     // 공유 내부 클래스의 공유속성 호출
        Outer.Share.method2();      // 공유 내부 클래스의 공유함수 호출

//        TODO : 3) 로컬 클래스 : 함수 안의 클래스
        outer.method(); // 안에서 클래스 자동 생성됨



    }
}

실행결과

 

외부 클래스가 생성됨
Attr 내부 클래스가 생성됨
정작함수가 실행됨
Local 객체가 생성됨

반응형

'Java > Java 이론' 카테고리의 다른 글

[JSP] Java Server Pages 란?  (0) 2024.07.03
스레드(Thread)  (0) 2023.10.04
람다 함수  (0) 2023.10.02
파일 클래스를 이용한 파일 출력  (0) 2023.10.02
objectstream  (0) 2023.10.02
반응형
//         js   : 함수의 매개변수로 함수를 넣을 수 있음, 리턴값도 함수 내보내기 가능
//         java : 함수의 매개변수/리턴값으로 함수 사용 금지
//           => 부가기능 추가 : 5가지 경우의 대표 함수(형태)를 만들어서 사용
//           Runnable(실행) 함수   : 매개변수(x), 리턴값(x) 함수  예) void run()
//           Supplier(공급자) 함수 : 매개변수(x), 리턴값(o) 함수  예) int get()
//           Consumer(소비자) 함수 : 매개변수(o), 리턴값(x) 함수  예) void accept(int t)
//           Function(일반) 함수  : 매개변수(o), 리턴값(o) 함수  예) int apply(int t)
//           Predicate(논리(명제)) 함수  : 매개변수(o), 리턴값(o, 참/거짓) 함수  예) boolean apply(int t)
 /**
     * 1~100까지 중 10개의 랜덤 숫자 배열에 넣기 함수
     * 제네릭 함수 : 제네릭을 매개변수에 사용하는 함수, 반환타입 앞에 <T>를 붙임
     * T 클래스 : 대표 T : 임의의 어떤 클래스를 대표하는 클래스로 사용
     * 제네릭 함수 : static <T> 반환타입 함수명(매개변수타입 매개변수명...) {}
     *
     * @param s
     * @param list
     * @param <T>
     */
    static <T> void makeRandomList(Supplier<T> s, List<T> list) {
        for (int i = 0; i < 10; i++) {
            list.add(s.get()); // s.get() : 매개변수로 전달되는 생산자 함수를 대리하는 함수
        }
    }

    /**
     * List에 저장된 요소의 값이(i) 짝수인것만 화면에 출력
     *
     * @param p
     * @param c
     * @param list
     * @param <T>
     */
    static <T> void printEventNum(Predicate<T> p, Consumer<T> c, List<T> list) {
        for (T i : list) {
//            명제 : 참/거짓이 있는 문장
            if (p.test(i)) { //  p.test(값)   : 매개변수로 전달되는 논리(명제) 함수를 대리하는 함수
                c.accept(i); // c.accept(값) : 매개변수로 전달되는 소비자 함수를 대리하는 함수
            }
        }
        System.out.println(); // 줄바꿈
    }

    /**
     * 1의 자리를 없앤 새로운 배열을 만들어서 List에 저장하는 함수(1의 자리는 0으로 변경)
     * 제네릭 함수 : 함수의 리턴값 앞에 <T>, 제네릭표현식을 사용하는 함수
     *
     * @param f
     * @param list
     * @param <T>
     * @return
     */
    static <T> List<T> doSomething(Function<T, T> f, List<T> list) {
        List<T> newList = new ArrayList<T>(list.size());

        for (T i : list) {
            newList.add(f.apply(i)); //  p.apply(값)   : 매개변수로 전달되는 일반 함수를 대리하는 함수
        }
        return newList;
    }
 public static void main(String[] args) {

        Supplier<Integer> s = () -> (int)(Math.random()*100) + 1;   // 1 ~ 100까지 랜덤
        Consumer<Integer> c = i -> System.out.println(i + ",");     // i 출력 함수
        Predicate<Integer> p = i -> i % 2 == 0;                     // 2의 배수만 리턴하는 함수
        Function<Integer, Integer> f = i -> i/10*10;                // i의 값 중 1의 자리를 없애는 함수
                                                                    // 예) 9.7 -> 90

//        TODO : 결과 실행
        List<Integer> list = new ArrayList<>();

//        TODO : 정적 함수를 호출하면 마지막 매개변수(배열)에 값이 저장되어 리턴됨(화면출력됨)
        makeRandomList(s, list);
        System.out.println(list);   // 결과출력 : 1 ~ 100까지 랜덤수가 화면출력됨
        System.out.println("------------------------------------------------------");
        printEventNum(p, c, list);  // 결과 : 배열에 짝수인것만 화면에 출력
        System.out.println("------------------------------------------------------");
        List<Integer> list2 = doSomething(f, list);
        System.out.println(list2); // 결과 : 일의 자리를 없앤 배열



    }

 

실행 결과

[97, 38, 64, 5, 62, 76, 58, 49, 35, 29]
------------------------------------------------------
38,
64,
62,
76,
58,

------------------------------------------------------
[90, 30, 60, 0, 60, 70, 50, 40, 30, 20]

반응형

'Java > Java 이론' 카테고리의 다른 글

스레드(Thread)  (0) 2023.10.04
중첩 클래스  (0) 2023.10.02
파일 클래스를 이용한 파일 출력  (0) 2023.10.02
objectstream  (0) 2023.10.02
printstream  (0) 2023.10.02
반응형
* description : File 클래스 : 파일생성 또는 폴더 생성, 정보 보기 기능
public class FileApplication {
    public static void main(String[] args) throws Exception {
//        TODO : 1) 텍스트 파일을 읽어서 리스트 배열로 가져오기 : Files.readAllLines(Paths.get(경로))
        List<String> lines
                = Files.readAllLines(Paths.get("src/main/resources/file1.txt"));
        System.out.println(lines);  // 배열 출력

//        TODO : 2) byte 파일을 읽어서 데이터 가져오기
        byte[] bytes = Files.readAllBytes(Paths.get("src/main/resources/test1.db"));
        System.out.println(Arrays.toString(bytes)); // 결과 출력

    }
}

 

실행결과


[hello, how are you, nice to meet you]
[10, 20, 30]

반응형

'Java > Java 이론' 카테고리의 다른 글

중첩 클래스  (0) 2023.10.02
람다 함수  (0) 2023.10.02
objectstream  (0) 2023.10.02
printstream  (0) 2023.10.02
보조스트림 : 기본 자료형으로 입출력하기  (0) 2023.10.02
반응형
* description : 키보드로 부터 한 줄씩 문자열 얻어서 출력하기
* 요약 :
*          System.in   : 키보드로부터의 입력을 의미
*          System.out  : 모니터로 출력을 의미
public class KeyboardApplication {
    public static void main(String[] args) throws Exception {
//        TODO : 키보드 입력 -> byte 입력스트림에 넣기
        InputStream inputStream = System.in;

//        TODO : 보조스트림 적용 #1 : byte -> char 기반으로 변경
        Reader reader = new InputStreamReader(inputStream);

//        TODO : 보조스트림 적용 #2 : 버퍼 추가
//            보조기능 #1 + #2 가 적용된 스트림
//           Scanner 객체가 위의 기능을 모두 가지고 있음
        BufferedReader bufferedReader = new BufferedReader(reader);

//        TODO : 무한 반복문
        while (true){
            String str = bufferedReader.readLine();     // 한 줄씩 읽기
            if(str.equals("q") || str.equals("quite")) break;   // q 이거나 quite 이면 종료
            System.out.println(str);
        }
        bufferedReader.close();


    }
}

실행결과

adasdada
adasdada
dadsada
dadsada
dsadsa
dsadsa
dfasf
dfasf
as
as
q <- q 입력시 종료

반응형

+ Recent posts