<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sofia_777.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 16 Nov 2022 05:44:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sofia_777.log</title>
            <url>https://velog.velcdn.com/images/sofia_777/profile/cf1f4e40-655f-4178-b9c8-d9e3a16a0258/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sofia_777.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sofia_777" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[2022.10.18 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.18-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.18-Spring</guid>
            <pubDate>Wed, 16 Nov 2022 05:44:14 GMT</pubDate>
            <description><![CDATA[<h1 id="char-20-security">Char 20. Security</h1>
<h2 id="보안-관련-프로젝트-생성">보안 관련 프로젝트 생성</h2>
<ul>
<li>보안 관련 라이브러리 추가<pre><code class="language-java">&lt;dependency&gt;
  &lt;groupId&gt;org.springframework.security&lt;/groupId&gt;
  &lt;artifactId&gt;spring-security-config&lt;/artifactId&gt;
  &lt;version&gt;3.2.5.RELEASE&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
</li>
</ul>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>3.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.2.4.RELEASE</version>
</dependency>

<pre><code>- web.xml 추가
```java
param-value&gt;
/WEB-INF/spring/root-context.xml
Spring bean configuration 파일 추가
&lt;/param-value&gt;</code></pre><pre><code class="language-java">&lt;filter&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy
    &lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;</code></pre>
<ul>
<li>Spring bean configuration 파일 추가<pre><code class="language-java"></code></pre>
</li>
</ul>
<p>&lt;security:http auto-config=&quot;true&quot;&gt;
Intercept 경로 추가
</security:http></p>
<p><a href="security:authentication-manager">security:authentication-manager</a>
    계정 설정
</security:authentication-manager></p>
<pre><code>
- 컨트롤러, 뷰 추가
```java
@RequestMapping(인터셉트 당할 경로)
public String login(Locale locale, Model model) {
    뷰 이동
}</code></pre><p><img src="https://velog.velcdn.com/images/sofia_777/post/fd5c1203-87ec-4fb7-bd76-8aff9c16f31a/image.png" alt=""></p>
<hr>
<h3 id="예제-1">예제 1</h3>
<p>login.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    login.jsp입니다.
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>login.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;loginForm~!!&lt;/h1&gt;
    &lt;form method=&quot;post&quot; action=&quot;j_spring_security_check&quot;&gt;
        &lt;!-- 로그인 실패시 --&gt;
        &lt;c:if test=&quot;${param.ng == &#39;777&#39;}&quot;&gt;
            &lt;p&gt;
                Login NG! &lt;br&gt;            
            &lt;/p&gt;
        &lt;/c:if&gt;
        id2022 : &lt;input type=&quot;text&quot; name=&quot;j_username&quot;&gt;&lt;br&gt;        
        id2022 : &lt;input type=&quot;text&quot; name=&quot;j_password&quot;&gt;&lt;br&gt;        
    &lt;!-- j_spring_security_check, j_password는 이미 그냥 정해져있는거임 --&gt;
    &lt;input type=&quot;submit&quot; value=&quot;login2022&quot;&gt;&lt;br&gt;        

    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>success.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    success.jsp~~!!
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>welcome.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    welcome.jsp입니다.
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>web.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app version=&quot;2.5&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&gt;

    &lt;!-- The definition of the Root Spring Container shared by all Servlets and Filters --&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
        &lt;param-value&gt;
        /WEB-INF/spring/root-context.xml
        /WEB-INF/spring/appServlet/security-context.xml
        &lt;/param-value&gt;
    &lt;/context-param&gt;

    &lt;filter&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;
    &lt;/filter&gt;

    &lt;filter-mapping&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;


    &lt;!-- Creates the Spring Container shared by all Servlets and Filters --&gt;
    &lt;listener&gt;
        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
    &lt;/listener&gt;

    &lt;!-- Processes application requests --&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;appServlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
            &lt;param-value&gt;/WEB-INF/spring/appServlet/servlet-context.xml&lt;/param-value&gt;
        &lt;/init-param&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;

    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;appServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;

&lt;/web-app&gt;</code></pre>
<p>HomeController .java</p>
<pre><code class="language-java">package com.javalec.spring_security;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;

    }

    //추가 된 부분
    @RequestMapping(&quot;login.html&quot;)
    public String login() {
        return &quot;security/login&quot;;
    }

    //추가 된 부분
    @RequestMapping(&quot;welcome.html&quot;)
    public String welcome() {

        return &quot;security/welcome&quot;;
    }

    //추가 된 부분
    @RequestMapping(&quot;loginForm.html&quot;)
    public String loginForm() {

        return &quot;security/loginForm&quot;;
    }
    //추가 된 부분
    @RequestMapping(&quot;success&quot;)
    public String success() {

        return &quot;security/success&quot;;
    }
}</code></pre>
<p>security-context.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:security=&quot;http://www.springframework.org/schema/security&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;security:http auto-config=&quot;true&quot;&gt;
        &lt;!-- 꾸미기 --&gt;
        &lt;security:form-login login-page=&quot;/loginForm.html&quot;
            authentication-failure-url=&quot;/loginForm.html?ng=777&quot;
            default-target-url=&quot;/success&quot;/&gt;
            &lt;!-- 로그인 실패시 authentication-failure-url / 로그인 성공하였을때 default-target-url--&gt;
        &lt;!-- /login.html*로 들어온 얘들을 가로챈다. --&gt;
        &lt;security:intercept-url pattern=&quot;/login.html*&quot; access=&quot;ROLE_USER&quot;/&gt;
        &lt;!-- 계정정보에서 ROLE_USER인 계정정보를 가로챈다. --&gt;
        &lt;security:intercept-url pattern=&quot;/welcome.html*&quot; access=&quot;ROLE_ADMIN&quot;/&gt;
        &lt;!-- 계정정보에서 ROLE_ADMIN인 계정정보를 가로챈다. --&gt;
    &lt;/security:http&gt;

    &lt;!-- 계정정보  --&gt;
    &lt;security:authentication-manager&gt;
        &lt;security:authentication-provider&gt;
            &lt;security:user-service&gt;
                &lt;!-- 여기에 이제 계정 정보 들어감  --&gt;
                &lt;security:user name=&quot;user&quot; password=&quot;123&quot; authorities=&quot;ROLE_USER&quot;/&gt;
                &lt;security:user name=&quot;admin&quot; password=&quot;123&quot; authorities=&quot;ROLE_ADMIN,ROLE_USER&quot;/&gt;
                &lt;!-- 이런경우, ROLE_USER,ROLE_ADMIN 두개 다 로그인이 됨. --&gt;
            &lt;/security:user-service&gt;
        &lt;/security:authentication-provider&gt;
    &lt;/security:authentication-manager&gt;
&lt;/beans&gt;</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_security&quot; /&gt;

&lt;/beans:beans&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.17 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.17-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.17-Spring</guid>
            <pubDate>Wed, 16 Nov 2022 05:44:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sofia_777/post/774a5c6f-6870-46c5-af28-c500cc68bedd/image.png" alt="">
현재 표준형으로</p>
<p>mybatis와 서비스단 추가하여 사용</p>
<p>파라미터 데이터는 hashmap으로 진행중</p>
<p>xml파일은 파라미터 타입으로 해서  hashmap 사용하여 순서에 상관없이 필드명을 찾아감.(param.)</p>
<p>서비스단은 인터페이스와 파일 병합(lmpl)를 사용하여 진행</p>
<h3 id="예제-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/5edba30a-df84-4e6a-9475-4cf6d72a4335/image.png" alt="">
pom.xml</p>
<pre><code class="language-sql">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;!-- mybatis--&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
            &lt;version&gt;3.2.8&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis-spring&lt;/artifactId&gt;
            &lt;version&gt;1.2.2&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-sql">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_test_item_std&quot; /&gt;

    &lt;!-- 추가된 부분 --&gt;

    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    

    &lt;beans:bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;mapperLocations&quot; value=&quot;classpath:com/javalec/spring_test_item_std/dao/mapper/*.xml&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean id=&quot;sqlSession&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot;&gt;
        &lt;beans:constructor-arg index=&quot;0&quot; ref=&quot;sqlSessionFactory&quot;&gt;&lt;/beans:constructor-arg&gt;
    &lt;/beans:bean&gt;

    &lt;!-- 추가된 부분 끝 --&gt;


&lt;/beans:beans&gt;</code></pre>
<p>ItemController.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_item_std.controller;

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

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

import com.javalec.spring_test_item_std.dto.ItemDto;
import com.javalec.spring_test_item_std.service.ItemService;

@Controller
public class ItemController {

    @Autowired
    private ItemService service;

    @RequestMapping(&quot;/write&quot;)
    public String write() {
        System.out.println(&quot;@@@### write()&quot;);

        return &quot;itemWrite&quot;;
    }
    /////////////////////////////////////////////////////////////


    @RequestMapping(&quot;/writeResult&quot;)
    public String writeResult(@RequestParam HashMap&lt;String, String&gt; param, Model model) {
        System.out.println(&quot;@@@### ItemController.writeResult() start&quot;);

        service.write(param);

        System.out.println(&quot;@@@### ItemController.writeResult() end&quot;);
        return &quot;writeResult&quot;;
    }
//    
    @RequestMapping(&quot;/content_view&quot;)
    public String content_view(Model model) {
        System.out.println(&quot;@@@### ItemController.content_view() start&quot;);

        ArrayList&lt;ItemDto&gt; dtos = service.contentView();
        model.addAttribute(&quot;content_view&quot;,dtos);
        System.out.println(&quot;@@@### ItemController.content_view() end &quot;);

        return &quot;content_view&quot;;
    }

}</code></pre>
<p>ItemDto.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_item_std.dto;

public class ItemDto {
    String name;
    int price;
    String description;

    public ItemDto() {
        // TODO Auto-generated constructor stub
    }

    public ItemDto(String name, int price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

}</code></pre>
<p>ItemDao.xml</p>
<pre><code class="language-sql">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;!DOCTYPE mapper
    PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
    &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;

&lt;mapper namespace=&quot;com.javalec.spring_test_item_std.dao.ItemDao&quot;&gt;

    &lt;insert id=&quot;write&quot; parameterType=&quot;hashmap&quot;&gt;
           insert into item (name, price, description) values(#{name}, #{price}, #{description})
    &lt;/insert&gt;

    &lt;select id=&quot;contentView&quot; parameterType=&quot;hashmap&quot; resultType=&quot;com.javalec.spring_test_item_std.dto.ItemDto&quot;&gt;
           select name, price, description from item
    &lt;/select &gt;

&lt;/mapper&gt;</code></pre>
<p>ItemDao.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_item_std.dao;

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

import com.javalec.spring_test_item_std.dto.*;

public interface ItemDao {

    public void write(HashMap&lt;String, String&gt; param);

    public ArrayList&lt;ItemDto&gt; contentView();

}</code></pre>
<p>ItemService.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_item_std.service;

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

import com.javalec.spring_test_item_std.dto.ItemDto;

public interface ItemService {

    public void write(HashMap&lt;String, String&gt; param);

    public ArrayList&lt;ItemDto&gt; contentView();


}</code></pre>
<p>ItemServiceImpl.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_item_std.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;

import com.javalec.spring_test_item_std.dao.*;
import com.javalec.spring_test_item_std.dto.ItemDto;

@Service(&quot;ItemService&quot;)
public class ItemServiceImpl implements ItemService {

    @Autowired
    private SqlSession sqlSession;

    @Override
    public void write(HashMap&lt;String, String&gt; param) {
        System.out.println(&quot;@@@### ItemServiceImpl.write() start&quot;);
        ItemDao dao = sqlSession.getMapper(ItemDao.class);

        dao.write(param);
        System.out.println(&quot;@@@### ItemServiceImpl.write() end&quot;);        
    }

    @Override
    public ArrayList&lt;ItemDto&gt; contentView() {
        System.out.println(&quot;@@@### ItemServiceImpl.contentView() start&quot;);
        ItemDao dao = sqlSession.getMapper(ItemDao.class);
        ArrayList&lt;ItemDto&gt; dtos = dao.contentView();
        System.out.println(&quot;@@@### ItemServiceImpl.contentView() end&quot;);    
        return dtos;
    }

}</code></pre>
<p>writeResult.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;a href=&quot;content_view&quot;&gt;결과 보기&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>ItemWrite.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form method=&quot;post&quot; action=&quot;writeResult&quot;&gt;
        &lt;table&gt;
            &lt;tr&gt;
                &lt;td&gt;상품명&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;가격&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;price&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;설명&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;description&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;전송&quot;&gt;
                    &lt;input type=&quot;reset&quot; value=&quot;취소&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>content_view.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;상품명&lt;/td&gt;
            &lt;td&gt;가격&lt;/td&gt;
            &lt;td&gt;설명&lt;/td&gt;
        &lt;/tr&gt;
        &lt;c:forEach items=&quot;${content_view}&quot; var=&quot;dto&quot;&gt;
            &lt;tr&gt;
                &lt;td&gt;${dto.name}&lt;/td&gt;
                &lt;td&gt;${dto.price}&lt;/td&gt;
                &lt;td&gt;${dto.description}&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="예제2">예제2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/0a98b237-30fa-4250-a86d-be4da717cb85/image.png" alt="">
pom.xml</p>
<pre><code class="language-sql">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
            &lt;version&gt;3.2.8&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis-spring&lt;/artifactId&gt;
            &lt;version&gt;1.2.2&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-sql">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_test_member_std&quot; /&gt;

    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    

    &lt;beans:bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;mapperLocations&quot; value=&quot;classpath:com/javalec/spring_test_member_std/dao/mapper/*.xml&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean id=&quot;sqlSession&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot;&gt;
        &lt;beans:constructor-arg index=&quot;0&quot; ref=&quot;sqlSessionFactory&quot;&gt;&lt;/beans:constructor-arg&gt;
    &lt;/beans:bean&gt;    

&lt;/beans:beans&gt;</code></pre>
<p>MemServiceImpl.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_member_std.service;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.javalec.spring_test_member_std.dao.*;
import com.javalec.spring_test_member_std.dto.MemDto;

@Service
public class MemServiceImpl implements MemService{

    @Autowired
    private SqlSession sqlSession;

    @Override
    public ArrayList&lt;MemDto&gt; loginYn(HashMap&lt;String, String&gt; param) {
        IMemDao dao = sqlSession.getMapper(IMemDao.class);
        ArrayList&lt;MemDto&gt; dtos = dao.loginYn(param);

        return dtos;
    }

    @Override
    public void write(HashMap&lt;String, String&gt; param) {
        IMemDao dao = sqlSession.getMapper(IMemDao.class);
        dao.write(param);
    }

}</code></pre>
<p>MemService.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_member_std.service;

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

import com.javalec.spring_test_member_std.dto.MemDto;

public interface MemService {
    public ArrayList&lt;MemDto&gt; loginYn(HashMap&lt;String, String&gt; param);
    public void write(HashMap&lt;String, String&gt; param);
}</code></pre>
<p>MemDto.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_member_std.dto;

public class MemDto {
    String mem_uid;
    String mem_pwd;
    String mem_name;

    public MemDto() {
        // TODO Auto-generated constructor stub
    }

    public MemDto(String mem_uid, String mem_pwd, String mem_name) {
        this.mem_uid = mem_uid;
        this.mem_pwd = mem_pwd;
        this.mem_name = mem_name;
    }

    public String getMem_uid() {
        return mem_uid;
    }
    public void setMem_uid(String mem_uid) {
        this.mem_uid = mem_uid;
    }
    public String getMem_pwd() {
        return mem_pwd;
    }
    public void setMem_pwd(String mem_pwd) {
        this.mem_pwd = mem_pwd;
    }
    public String getMem_name() {
        return mem_name;
    }
    public void setMem_name(String mem_name) {
        this.mem_name = mem_name;
    }

}</code></pre>
<p>IMemDao.xml</p>
<pre><code class="language-sql">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE mapper
    PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
    &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;

&lt;mapper namespace=&quot;com.javalec.spring_test_member_std.dao.IMemDao&quot;&gt;

    &lt;select id=&quot;loginYn&quot; parameterType=&quot;hashmap&quot; resultType=&quot;com.javalec.spring_test_member_std.dto.MemDto&quot;&gt;
        select mem_pwd from MVC_MEMBER WHERE mem_uid=#{mem_uid}
    &lt;/select&gt;

    &lt;insert id=&quot;write&quot; parameterType=&quot;hashmap&quot;&gt;
        insert into mvc_member values(#{mem_uid},#{mem_pwd},#{mem_name})
    &lt;/insert&gt;

&lt;/mapper&gt;</code></pre>
<p>IMemDao.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_member_std.dao;

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

import com.javalec.spring_test_member_std.dto.*;

public interface IMemDao {
    public ArrayList&lt;MemDto&gt; loginYn(HashMap&lt;String, String&gt; param);
    public void write(HashMap&lt;String, String&gt; param);
}</code></pre>
<p>MemController.java</p>
<pre><code class="language-sql">package com.javalec.spring_test_member_std.controller;

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

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.javalec.spring_test_member_std.dto.*;
import com.javalec.spring_test_member_std.service.MemService;

@Controller
public class MemController {

    @Autowired
    private MemService service;

    @RequestMapping(&quot;/login&quot;)
    public String login() {
        System.out.println(&quot;@@@### login()&quot;);

        return &quot;login&quot;;
    }

    @RequestMapping(&quot;/login_yn&quot;)
    public String login_yn(@RequestParam HashMap&lt;String, String&gt; param, Model model) {
        System.out.println(&quot;@@@### login_yn()&quot;);

        ArrayList&lt;MemDto&gt; dtos = service.loginYn(param);

        if (dtos.isEmpty()) {
            return &quot;redirect:login&quot;;
        }else {
            if (param.get(&quot;mem_pwd&quot;).equals(dtos.get(0).getMem_pwd())) {
                return &quot;redirect:login_ok&quot;;
            }else {
                return &quot;redirect:login&quot;;
            }
        }

    }

    @RequestMapping(&quot;/login_ok&quot;)
    public String login_ok() {
        System.out.println(&quot;@@@### login_ok()&quot;);

        return &quot;login_ok&quot;;
    }

    @RequestMapping(&quot;/register&quot;)
    public String register() {
        System.out.println(&quot;@@@### register()&quot;);

        return &quot;register&quot;;
    }

    @RequestMapping(&quot;/registerOk&quot;)
    public String registerOk(@RequestParam HashMap&lt;String, String&gt; param, Model model) {
        System.out.println(&quot;@@@### registerOk()&quot;);

        service.write(param);

        return &quot;redirect:login&quot;;
    }

}</code></pre>
<p>register.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table border=&quot;1&quot; align=&quot;center&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;registerOk&quot;&gt;
            &lt;tr height=&quot;50&quot;&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;h1&gt;회원 가입 신청&lt;/h1&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td width=&quot;80&quot;&gt;
                    User ID
                &lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; size=&quot;20&quot; name=&quot;mem_uid&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td width=&quot;80&quot;&gt;
                    암호
                &lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; size=&quot;20&quot; name=&quot;mem_pwd&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td width=&quot;80&quot;&gt;
                    이름
                &lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; size=&quot;20&quot; name=&quot;mem_name&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;등록&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>login.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table border=&quot;1&quot; align=&quot;center&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;login_yn&quot;&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;
                    사용자ID
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;
                    &lt;input type=&quot;text&quot; name=&quot;mem_uid&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;
                    비밀번호
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;
                    &lt;input type=&quot;text&quot; name=&quot;mem_pwd&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;로그인&quot;&gt;
                    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;!-- &lt;input type=&quot;button&quot; value=&quot;회원가입&quot;&gt; --&gt;
                    &lt;a href=&quot;register&quot;&gt;회원가입&lt;/a&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>login_ok.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    login ok~!!!
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h1 id="char-18트랜잭션transaction">Char 18.트랜잭션(Transaction)</h1>
<p>논리적 단위로 어떤 한 부분의 작업이 완료되었다 하더라도, 다른 부분의 작업이 완료되지 않을 경우 전체 취소되는 것입니다.</p>
<p>이때, 작업이 완료되는 것을 커밋(commit)이라고 하고, 작업이 취소되는 것을 롤백(rollback)이라고 합니다.</p>
<p>예로 트랜잭션을 하지 않았을 경우 rollback이 되지 않는 경우
<img src="https://velog.velcdn.com/images/sofia_777/post/e7645b16-a516-4369-a1bc-7f7a639bf50a/image.png" alt=""></p>
<p>트랜젝션 처리가 되어 있는 경우
(PlatformTransactionManger을 사용)</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/4f47f05a-b4e9-4c57-9f24-9c98f870928a/image.png" alt=""></p>
<h2 id="사용하기-전-설정">사용하기 전 설정</h2>
<p>*. servlet-context.xml</p>
<pre><code class="language-java">
&lt;beans:bean name=&quot;transactionManager&quot; class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;&gt;
&lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
&lt;/beans:bean&gt;

&lt;beans:bean name=&quot;dao&quot; class=&quot;com.javalec.spring_tran_apply.dao.TicketDao&quot; &gt;
&lt;beans:property name=&quot;template&quot; ref=&quot;template&quot; /&gt;
&lt;beans:property name=&quot;transactionManager&quot; ref=&quot;transactionManager&quot;&gt;&lt;/beans:property&gt;
&lt;/beans:bean&gt;
![](https://velog.velcdn.com/images/sofia_777/post/cefdee1c-08dc-4706-bdcd-696786fd96dc/image.png)
</code></pre>
<p>*. Dao</p>
<pre><code class="language-java">PlatformTransactionManager transactionManager;

public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}

public void buyTicket(final TicketDto dto) {
TransactionDefinition definition = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(definition);

try {
template.update(new PreparedStatementCreator() {
}
});

template.update(new PreparedStatementCreator() {
}
});

transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
![](https://velog.velcdn.com/images/sofia_777/post/4bcd86fe-2ce1-4448-8caa-202d8afd67a2/image.png)
</code></pre>
<h3 id="예제-1-1">예제 1</h3>
<p>테이블 생성</p>
<pre><code class="language-sql">CREATE TABLE CARD
(consumerId VARCHAR2(10)
,amount NUMBER(1)
);

 CREATE TABLE TICKET
 (consumerId VARCHAR2(10)
 ,countNum NUMBER(1) CHECK(countNum &lt; 5)
 );
</code></pre>
<p>pom.xml</p>
<pre><code class="language-sql">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>servlert-content.xml</p>
<pre><code class="language-sql">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_tran&quot; /&gt;

    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    

    &lt;beans:bean name=&quot;template&quot; class=&quot;org.springframework.jdbc.core.JdbcTemplate&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;        

    &lt;beans:bean name=&quot;transactionManager&quot; class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;
    &lt;beans:bean name=&quot;dao&quot; class=&quot;com.javalec.spring_tran.dao.TicketDao&quot;&gt;
        &lt;beans:property name=&quot;template&quot; ref=&quot;template&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;transactionManager&quot; ref=&quot;transactionManager&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;
&lt;/beans:beans&gt;</code></pre>
<p>HomeController.java</p>
<pre><code class="language-sql">package com.javalec.spring_tran;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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 com.javalec.spring_tran.dao.TicketDao;
import com.javalec.spring_tran.dto.TicketDto;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
    private TicketDao dao;

    @Autowired
    public void setDao(TicketDao dao) {
        this.dao = dao;
    }

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;redirect:buy_ticket&quot;;
    }

    @RequestMapping(&quot;buy_ticket&quot;)
    public String buy_ticket() {
        return &quot;buy_ticket&quot;;
    }

    @RequestMapping(&quot;buy_ticket_card&quot;)
    public String buy_ticket_card(TicketDto ticketDto, Model model) {
        dao.buyTicket(ticketDto);
        model.addAttribute(&quot;ticketInfo&quot;, ticketDto);

        return &quot;buy_ticket_end&quot;;
    }

}</code></pre>
<p>TicketDto.java</p>
<pre><code class="language-sql">package com.javalec.spring_tran.dto;

public class TicketDto {
    private String consumerId;
    private int countnum;

    public String getConsumerId() {
        return consumerId;
    }
    public void setConsumerId(String consumerId) {
        this.consumerId = consumerId;
    }
    public int getCountnum() {
        return countnum;
    }
    public void setCountnum(int countnum) {
        this.countnum = countnum;
    }

}</code></pre>
<p>TicketDao.java</p>
<pre><code class="language-sql">package com.javalec.spring_tran.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import com.javalec.spring_tran.dto.TicketDto;

public class TicketDao {
    JdbcTemplate template;
    PlatformTransactionManager transactionManager;

    public void setTransactionManager(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    public void setTemplate(JdbcTemplate template) {
        this.template = template;
    }

    public void buyTicket(final TicketDto dto) {
        TransactionDefinition definition = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(definition);

        try {
            template.update(new PreparedStatementCreator() {

                @Override
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    String query=&quot;insert into card(consumerId, amount) values(?,?)&quot;;
                    PreparedStatement pstmt = con.prepareStatement(query);
                    pstmt.setString(1, dto.getConsumerId());
                    pstmt.setInt(2, dto.getCountnum());

                    return pstmt;
                }
            });

            template.update(new PreparedStatementCreator() {

                @Override
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    String query=&quot;insert into ticket(consumerId, countnum) values(?,?)&quot;;
                    PreparedStatement pstmt = con.prepareStatement(query);
                    pstmt.setString(1, dto.getConsumerId());
                    pstmt.setInt(2, dto.getCountnum());

                    return pstmt;
                }
            });

            transactionManager.commit(status);
        } catch (Exception e) {
            e.printStackTrace();

            transactionManager.rollback(status);
        }

    }

}</code></pre>
<p>buy_ticket.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;p&gt;카드 결제&lt;/p&gt;
    &lt;form action=&quot;buy_ticket_card&quot;&gt;
        고객 아이디 :&lt;input type=&quot;text&quot; name=&quot;consumerId&quot;&gt;&lt;br&gt;
        티켓 구매수 :&lt;input type=&quot;text&quot; name=&quot;countnum&quot;&gt;&lt;br&gt;
        &lt;input type=&quot;submit&quot; value=&quot;구매&quot;&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>buy_ticket_end.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    buy_ticket_end.jsp 입니다.&lt;br&gt;
    ${ticketInfo.consumerId}&lt;br&gt;
    ${ticketInfo.countnum}&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.14 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.14-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.14-Spring</guid>
            <pubDate>Wed, 16 Nov 2022 05:43:56 GMT</pubDate>
            <description><![CDATA[<h1 id="char-17-mybatis">Char 17. Mybatis</h1>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/224e8831-3f0b-4712-9c54-fe2bcb31b239/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/1147860f-87ba-4b33-bd8a-f5158ebd6aa0/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/d3633019-d67d-4c18-b751-705fc1ded33b/image.png" alt="">
pom.xml에</p>
<pre><code class="language-java">**&lt;!-- mybatis --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
            &lt;version&gt;3.2.8&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis-spring&lt;/artifactId&gt;
            &lt;version&gt;1.2.2&lt;/version&gt;
        &lt;/dependency&gt;


         &lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;**</code></pre>
<h3 id="예제-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7cc68ba7-bb34-4239-b603-da3cbae3c292/image.png" alt=""></p>
<p>pom.xml</p>
<pre><code class="language-java">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;!-- mybatis--&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
            &lt;version&gt;3.2.8&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis-spring&lt;/artifactId&gt;
            &lt;version&gt;1.2.2&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_mvc_board_mybatis&quot; /&gt;

    &lt;!-- 추가된 부분 --&gt;

    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    

    &lt;beans:bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;mapperLocations&quot; value=&quot;classpath:com/javalec/spring_mvc_board_mybatis/dao/mapper/*.xml&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean id=&quot;sqlSession&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot;&gt;
        &lt;beans:constructor-arg index=&quot;0&quot; ref=&quot;sqlSessionFactory&quot;&gt;&lt;/beans:constructor-arg&gt;
    &lt;/beans:bean&gt;

    &lt;!-- 추가된 부분 끝 --&gt;
&lt;/beans:beans&gt;</code></pre>
<p>BDto.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_mybatis.dto;

import java.sql.Timestamp;

public class BDto {
    int bId;
    String bName;
    String bTitle;
    String bContent;
    Timestamp bDate;
    int bHit;

    public BDto() {
        // TODO Auto-generated constructor stub
    }

    public BDto(int bId, String bName, String bTitle, String bContent, Timestamp bDate, int bHit) {
        this.bId = bId;
        this.bName = bName;
        this.bTitle = bTitle;
        this.bContent = bContent;
        this.bDate = bDate;
        this.bHit = bHit;
    }

    public int getbId() {
        return bId;
    }
    public void setbId(int bId) {
        this.bId = bId;
    }
    public String getbName() {
        return bName;
    }
    public void setbName(String bName) {
        this.bName = bName;
    }
    public String getbTitle() {
        return bTitle;
    }
    public void setbTitle(String bTitle) {
        this.bTitle = bTitle;
    }
    public String getbContent() {
        return bContent;
    }
    public void setbContent(String bContent) {
        this.bContent = bContent;
    }
    public Timestamp getbDate() {
        return bDate;
    }
    public void setbDate(Timestamp bDate) {
        this.bDate = bDate;
    }
    public int getbHit() {
        return bHit;
    }
    public void setbHit(int bHit) {
        this.bHit = bHit;
    }

}</code></pre>
<p>IBDao.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_mybatis.dao;

import java.util.ArrayList;

import com.javalec.spring_mvc_board_mybatis.dto.*;

public interface IBDao {
    //IBDao.xml파일의 id는 메소드명 ! 
    //예로 들면 list, write, contentView, modify... 

    public ArrayList&lt;BDto&gt; list();

    public void write(String bName, String bTitle, String bContent);

    public BDto contentView(String strID);

    public void modify(String bId, String bName, String bTitle, String bContent);

    public void delete(String strID);

}</code></pre>
<p>IBDao.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE mapper
    PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
    &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;

&lt;mapper namespace=&quot;com.javalec.spring_mvc_board_mybatis.dao.IBDao&quot;&gt;

    &lt;!--IBDao.java의 --&gt;

    &lt;!-- ArrayList&lt;BDto&gt; list --&gt;
    &lt;select id=&quot;list&quot; resultType=&quot;com.javalec.spring_mvc_board_mybatis.dto.BDto&quot;&gt;
        select bId, bName, bTitle, bContent, bDate, bHit from MVC_BOARD
    &lt;/select&gt;

    &lt;!-- write부분  --&gt;
    &lt;insert id=&quot;write&quot;&gt;
        insert into MVC_BOARD(bId, bName, bTitle, bContent, bHit) 
               values(MVC_BOARD_SEQ.NEXTVAL,#{param1},#{param2},#{param3},0)
    &lt;/insert&gt;


   &lt;!-- contentView --&gt;
    &lt;select id=&quot;contentView&quot; resultType=&quot;com.javalec.spring_mvc_board_mybatis.dto.BDto&quot;&gt;
       select bId, bName, bTitle, bContent, bDate, bHit from MVC_BOARD where bId=#{param1}
    &lt;/select&gt;


    &lt;!-- modify부분  --&gt;
    &lt;update id=&quot;modify&quot;&gt;
        update MVC_BOARD set bName = #{param2}, bTitle = #{param3}, bContent = #{param4}
         where bId=#{param1}
    &lt;/update&gt;

    &lt;!-- 아래도 됨!
    &lt;insert id=&quot;modify&quot;&gt;
        update MVC_BOARD set bName = #{param2}, bTitle = #{param3}, bContent = #{param4}
         where bId=#{param1}
    &lt;/insert&gt;  
    --&gt;


    &lt;!-- delete부분  --&gt;
    &lt;delete id=&quot;delete&quot;&gt;
        delete from MVC_BOARD where bId=#{param1}
    &lt;/delete&gt;

&lt;/mapper&gt;</code></pre>
<p>BController.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_mybatis.controller;

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.javalec.spring_mvc_board_mybatis.dao.IBDao;

//import com.javalec.spring_mvc_board_jdbc.service.BContentService;
//import com.javalec.spring_mvc_board_jdbc.service.BDeleteService;
//import com.javalec.spring_mvc_board.command.BCommand;
//import com.javalec.spring_mvc_board.command.BContentCommand;
//import com.javalec.spring_mvc_board.command.BDeleteCommand;
//import com.javalec.spring_mvc_board.command.BListCommand;
//import com.javalec.spring_mvc_board.command.BModifyCommand;
//import com.javalec.spring_mvc_board.command.BWriteCommand;
//import com.javalec.spring_mvc_board_jdbc.service.BListService;
//import com.javalec.spring_mvc_board_jdbc.service.BModifyService;
//import com.javalec.spring_mvc_board_jdbc.service.BService;
//import com.javalec.spring_mvc_board_jdbc.service.BWriteService;
//import com.javalec.spring_mvc_board_jdbc.util.Constant;

@Controller
public class BController {
//    BService service;
//    public JdbcTemplate template;
//    
//    @Autowired
//    public void setTemplate(JdbcTemplate template) {
//        this.template = template;
//        Constant.template = this.template;
//    }
    @Autowired
    private SqlSession sqlSession;

    @RequestMapping(&quot;/list&quot;)
    public String list(Model model) {
        System.out.println(&quot;@@@### list()&quot;);

//        service = new BListService();
//        service.execute(model);
        IBDao dao = sqlSession.getMapper(IBDao.class);
        model.addAttribute(&quot;list&quot;, dao.list());

        return &quot;list&quot;;
    }

    @RequestMapping(&quot;/write_view&quot;)
    public String write_view() {
        System.out.println(&quot;@@@### write_view()&quot;);

        return &quot;write_view&quot;;
    }

    @RequestMapping(&quot;/write&quot;)
    public String write(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### write()&quot;);

        IBDao dao = sqlSession.getMapper(IBDao.class);
        dao.write(request.getParameter(&quot;bName&quot;)
                , request.getParameter(&quot;bTitle&quot;)
                , request.getParameter(&quot;bContent&quot;));
        //여기서 write는 IBDao.java의 write메소드에 해당됨

//        model.addAttribute(&quot;request&quot;, request);
//        service = new BWriteService();
//        service.execute(model);

        return &quot;redirect:list&quot;;
    }
//    
    @RequestMapping(&quot;/content_view&quot;)
    public String content_view(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### content_view()&quot;);

        IBDao dao = sqlSession.getMapper(IBDao.class);
        model.addAttribute(&quot;content_view&quot;,dao.contentView(request.getParameter(&quot;bId&quot;)));

//        model.addAttribute(&quot;request&quot;, request);
//        service = new BContentService();
//        service.execute(model);

        return &quot;content_view&quot;;
    }
//    
    @RequestMapping(&quot;/modify&quot;)
    public String modify(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### modify()&quot;);

//        model.addAttribute(&quot;request&quot;, request);
//        service = new BModifyService();
//        service.execute(model);

        IBDao dao = sqlSession.getMapper(IBDao.class);
        dao.modify(request.getParameter(&quot;bId&quot;)
                 , request.getParameter(&quot;bName&quot;)
                 , request.getParameter(&quot;bTitle&quot;)
                 , request.getParameter(&quot;bContent&quot;));

        return &quot;redirect:list&quot;;
    }

    @RequestMapping(&quot;/delete&quot;)
    public String delete(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### delete()&quot;);

//        model.addAttribute(&quot;request&quot;, request);
//        service = new BDeleteService();
//        service.execute(model);

        IBDao dao = sqlSession.getMapper(IBDao.class);
        dao.delete(request.getParameter(&quot;bId&quot;));

        return &quot;redirect:list&quot;;
    }

}</code></pre>
<p>나머지 content.view.jsp와 listh.jsp, write_view.jsp는 전과 동일한 파일</p>
<hr>
<h3 id="예제-2">예제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/50bff24e-501e-428b-9636-02b088caf5c3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ea072f47-48e2-46e6-b219-6eea1d75fb3c/image.png" alt=""></p>
<p>servlet-context.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_test_member_mybatis&quot; /&gt;

    &lt;!-- 추가된 부분 --&gt;

    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    

    &lt;beans:bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;mapperLocations&quot; value=&quot;classpath:com/javalec/spring_test_member_mybatis/dao/mapper/*.xml&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean id=&quot;sqlSession&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot;&gt;
        &lt;beans:constructor-arg index=&quot;0&quot; ref=&quot;sqlSessionFactory&quot;&gt;&lt;/beans:constructor-arg&gt;
    &lt;/beans:bean&gt;

    &lt;!-- 추가된 부분 끝 --&gt;



&lt;/beans:beans&gt;</code></pre>
<p>MemDto.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_mybatis.dto;

public class MemDto {
    String mem_uid;
    String mem_pwd;
    String mem_name;


    public MemDto(String mem_uid, String mem_pwd, String mem_name) {
        super();
        this.mem_uid = mem_uid;
        this.mem_pwd = mem_pwd;
        this.mem_name = mem_name;
    }

    public String getMem_uid() {
        return mem_uid;
    }

    public void setMem_uid(String mem_uid) {
        this.mem_uid = mem_uid;
    }

    public String getMem_pwd() {
        return mem_pwd;
    }

    public void setMem_pwd(String mem_pwd) {
        this.mem_pwd = mem_pwd;
    }

    public String getMem_name() {
        return mem_name;
    }

    public void setMem_name(String mem_name) {
        this.mem_name = mem_name;
    }

    public MemDto() {

    }


}</code></pre>
<p>MemDao.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;!DOCTYPE mapper
    PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
    &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;

&lt;mapper namespace=&quot;com.javalec.spring_test_member_mybatis.dao.MemDao&quot;&gt;

    &lt;select id=&quot;loginYn&quot;  resultType=&quot;com.javalec.spring_test_member_mybatis.dto.MemDto&quot;&gt;
           select mem_pwd from MVC_MEMBER where mem_uid=#{param1}
    &lt;/select &gt;

    &lt;insert id=&quot;write&quot;&gt;
        insert into MVC_MEMBER(mem_uid, mem_pwd, mem_name) values(#{param1}, #{param2}, #{param3})
    &lt;/insert&gt;
&lt;/mapper&gt;</code></pre>
<p>MemDao .java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_mybatis.dao;

import java.util.ArrayList;

import com.javalec.spring_test_member_mybatis.dto.MemDto;

public interface MemDao {

    public ArrayList&lt;MemDto&gt; loginYn( String id, String pw);

    public void write(String mem_uid, String mem_pwd, String mem_name);
}</code></pre>
<p>MemController.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_mybatis.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.javalec.spring_test_member_mybatis.dao.MemDao;
import com.javalec.spring_test_member_mybatis.dto.MemDto;

//import com.javalec.spring_test_member_jdbc.util.Constant;
//import com.javalec.spring_test_member_jdbc.service.*;

@Controller
public class MemController {
//    MemService service;
//    public JdbcTemplate template;
//    
//    @Autowired
//    public void setTemplate(JdbcTemplate template) {
//        //메소드의 매개변수인 template는 servlet-context.xml의  name의 template
//        this.template = template;
//        Constant.template = this.template;
//    }
    @Autowired
    private SqlSession sqlSession;


    @RequestMapping(&quot;/login&quot;)
    public String login() {
        System.out.println(&quot;###@@@ login()&quot;);

        return &quot;login&quot;;
    }

    @RequestMapping(&quot;/login_yn&quot;)
    public String login_yn(HttpServletRequest request, Model model) {
        System.out.println(&quot;###@@@ login_yn()&quot;);

        //강사님 방법
        MemDao dao = sqlSession.getMapper(MemDao.class);
        ArrayList&lt;MemDto&gt; dtos = dao.loginYn(request.getParameter(&quot;mem_uid&quot;), request.getParameter(&quot;mem_pwd&quot;));

        if (dtos.isEmpty()) {
            return &quot;redirect:login&quot;;
        }else {
            if (request.getParameter(&quot;mem_pwd&quot;).equals(dtos.get(0).getMem_pwd())) {
                return &quot;redirect:login_ok&quot;;
            }else {
                return &quot;redirect:login&quot;;
            }
        }

        //내 방법
//        MemDao dao = sqlSession.getMapper(MemDao.class);
//        ArrayList&lt;MemDto&gt; dtos = dao.loginYn(request.getParameter(&quot;mem_uid&quot;), request.getParameter(&quot;mem_pwd&quot;));
//        
//        int result;
//        
//        if (dtos.isEmpty()) {
//            result=-1;
//        }else {
//            if (request.getParameter(&quot;mem_pwd&quot;).equals(dtos.get(0).getMem_pwd())) {
//                result = 1;
//            }else {
//                result =0;
//            }
//        }
//        
//        //분기처리
//        if (result == 1) {
//            return &quot;redirect:login_ok&quot;;//로그인 성공시 이동
//        }
//        return &quot;redirect:login&quot;;//로그인 실패시 그자리에 그대로 있음
    }
//    
    @RequestMapping(&quot;/login_ok&quot;)
    public String login_ok() {
        System.out.println(&quot;###@@@ login_ok()&quot;);

        return &quot;login_ok&quot;;
    }
//    
//    
    @RequestMapping(&quot;/register&quot;)
    public String register() {
        System.out.println(&quot;###@@@ register()&quot;);

        return &quot;register&quot;;
    }
//

    @RequestMapping(&quot;/registerOk&quot;)
    public String registerOk(HttpServletRequest request, Model model) {// 값을 받기위해 파라미터 넣음
        System.out.println(&quot;###@@@ registerOk&quot;);

        MemDao dao = sqlSession.getMapper(MemDao.class);
        dao.write(request.getParameter(&quot;mem_uid&quot;)
                , request.getParameter(&quot;mem_pwd&quot;) 
                , request.getParameter(&quot;mem_name&quot;));


        return &quot;redirect:login&quot;;
    }
//        

}</code></pre>
<p>.jsp 파일은 동일하다.</p>
<hr>
<h2 id="표준형-제작">표준형 제작</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/0a8f6613-1ef3-4d1f-8957-f262aacc1aeb/image.png" alt=""></p>
<p>HomeController.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_std;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

//        return &quot;home&quot;;
        return &quot;redirect:list&quot;;
        //바로 list로 이동
    }

}</code></pre>
<p>BController.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_std.controller;

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

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

//import com.javalec.spring_mvc_board_mybatis.dao.IBDao;
import com.javalec.spring_mvc_board_std.dto.BDto;
import com.javalec.spring_mvc_board_std.service.BService;

@Controller
public class BController {

//    @Autowired
//    private SqlSession sqlSession;


    @Autowired
    private BService service;


    @RequestMapping(&quot;/list&quot;)
    public String list(Model model) {

        System.out.println(&quot;@@@### BController.list() start&quot;);


//        IBDao dao = sqlSession.getMapper(IBDao.class);
//        model.addAttribute(&quot;list&quot;, dao.list());
        ArrayList&lt;BDto&gt; list = service.list();
        model.addAttribute(&quot;list&quot;, list);
        //&quot;list&quot;의 결과값을 ArrayList&lt;BDto&gt; list에 넣음

        System.out.println(&quot;@@@### BController.list() end&quot;);
        return &quot;list&quot;;
    }

    @RequestMapping(&quot;/write_view&quot;)
    public String write_view() {
        System.out.println(&quot;@@@### write_view()&quot;);

        return &quot;write_view&quot;;
    }

    @RequestMapping(&quot;/write&quot;)
//    public String write(HttpServletRequest request, Model model) {
    public String write(@RequestParam HashMap&lt;String,String&gt; param) {
        System.out.println(&quot;@@@### BController.write() start&quot;);

//        IBDao dao = sqlSession.getMapper(IBDao.class);
//        dao.write(request.getParameter(&quot;bName&quot;)
//                , request.getParameter(&quot;bTitle&quot;)
//                , request.getParameter(&quot;bContent&quot;));

        service.write(param);//매개변수 param만 넣기

        System.out.println(&quot;@@@### BController.write() end&quot;);
        return &quot;redirect:list&quot;;
    }



////    
//    @RequestMapping(&quot;/content_view&quot;)
//    public String content_view(HttpServletRequest request, Model model) {
//        System.out.println(&quot;@@@### content_view()&quot;);
//        
//        IBDao dao = sqlSession.getMapper(IBDao.class);
//        model.addAttribute(&quot;content_view&quot;,dao.contentView(request.getParameter(&quot;bId&quot;)));
//        return &quot;content_view&quot;;
//    }
////    
//    @RequestMapping(&quot;/modify&quot;)
//    public String modify(HttpServletRequest request, Model model) {
//        System.out.println(&quot;@@@### modify()&quot;);
//        
//        
//        IBDao dao = sqlSession.getMapper(IBDao.class);
//        dao.modify(request.getParameter(&quot;bId&quot;)
//                 , request.getParameter(&quot;bName&quot;)
//                 , request.getParameter(&quot;bTitle&quot;)
//                 , request.getParameter(&quot;bContent&quot;));
//        
//        return &quot;redirect:list&quot;;
//    }
//    
//    @RequestMapping(&quot;/delete&quot;)
//    public String delete(HttpServletRequest request, Model model) {
//        System.out.println(&quot;@@@### delete()&quot;);
//        
//        
//        IBDao dao = sqlSession.getMapper(IBDao.class);
//        dao.delete(request.getParameter(&quot;bId&quot;));
//        
//        return &quot;redirect:list&quot;;
//    }
//    
}</code></pre>
<p>IBDao.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_std.dao;

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

import com.javalec.spring_mvc_board_std.dto.*;

public interface IBDao {
    //IBDao.xml파일의 id는 메소드명 ! 
    //예로 들면 list, write, contentView, modify... 

    public ArrayList&lt;BDto&gt; list();

//    public void write(String bName, String bTitle, String bContent);
    public void write(HashMap&lt;String, String&gt; param);
    // 매개변수가 String bName, String bTitle, String bContent뿐만이 아니라 다른 것들도 있는 경우
    // 넘어가는 데이터가 100개 막 이런경우에 사용함

//    
//    public BDto contentView(String strID);
//    
//    public void modify(String bId, String bName, String bTitle, String bContent);
//    
//    public void delete(String strID);

}</code></pre>
<p>IBDao.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE mapper
    PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
    &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;

&lt;mapper namespace=&quot;com.javalec.spring_mvc_board_std.dao.IBDao&quot;&gt;

    &lt;!--IBDao.java의 --&gt;

    &lt;!-- ArrayList&lt;BDto&gt; list --&gt;
    &lt;select id=&quot;list&quot; resultType=&quot;com.javalec.spring_mvc_board_std.dto.BDto&quot;&gt;
        select bId, bName, bTitle, bContent, bDate, bHit from MVC_BOARD
    &lt;/select&gt;

    &lt;!-- write부분  --&gt;
    &lt;!-- haspmap의 형태로 처리하기 위해서    parameterType=&quot;hashmap&quot; 추가 --&gt;
    &lt;!-- 그리고 #{param}을 각 해당 name으로 바꾸면 됨 --&gt;
    &lt;insert id=&quot;write&quot; parameterType=&quot;hashmap&quot;&gt;
        insert into MVC_BOARD(bId, bName, bTitle, bContent, bHit) 
               values(MVC_BOARD_SEQ.NEXTVAL,#{bName},#{bTitle},#{bContent},0)
    &lt;/insert&gt;

&lt;/mapper&gt;</code></pre>
<p>BDto.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_std.dto;

import java.sql.Timestamp;

public class BDto {
    int bId;
    String bName;
    String bTitle;
    String bContent;
    Timestamp bDate;
    int bHit;

    public BDto() {
        // TODO Auto-generated constructor stub
    }

    public BDto(int bId, String bName, String bTitle, String bContent, Timestamp bDate, int bHit) {
        this.bId = bId;
        this.bName = bName;
        this.bTitle = bTitle;
        this.bContent = bContent;
        this.bDate = bDate;
        this.bHit = bHit;
    }

    public int getbId() {
        return bId;
    }
    public void setbId(int bId) {
        this.bId = bId;
    }
    public String getbName() {
        return bName;
    }
    public void setbName(String bName) {
        this.bName = bName;
    }
    public String getbTitle() {
        return bTitle;
    }
    public void setbTitle(String bTitle) {
        this.bTitle = bTitle;
    }
    public String getbContent() {
        return bContent;
    }
    public void setbContent(String bContent) {
        this.bContent = bContent;
    }
    public Timestamp getbDate() {
        return bDate;
    }
    public void setbDate(Timestamp bDate) {
        this.bDate = bDate;
    }
    public int getbHit() {
        return bHit;
    }
    public void setbHit(int bHit) {
        this.bHit = bHit;
    }

}</code></pre>
<p>BService.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_std.service;

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

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board_std.dto.BDto;

public interface BService {
    //public void execute(Model model); //선언

    public ArrayList&lt;BDto&gt; list();
    public void write(HashMap&lt;String, String&gt; param);
}</code></pre>
<p>BController.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_std.service;

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

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;

import com.javalec.spring_mvc_board_std.dao.*;
import com.javalec.spring_mvc_board_std.dto.BDto;

//인터페이스 구현
@Service(&quot;BService&quot;)
public class BServiceImpl implements BService{


    @Autowired
    private SqlSession sqlSession;

    //글 목록 보는 페이지
    @Override
    public ArrayList&lt;BDto&gt; list() {
        //데이터 흐름 확인용 로그
        System.out.println(&quot;@@@### BServiceImpl.list() start&quot;);

        IBDao dao = sqlSession.getMapper(IBDao.class);
        //model.addAttribute(&quot;list&quot;, dao.list());
        ArrayList&lt;BDto&gt; list = dao.list();
        //IBDao의 list

        //데이터 흐름 확인용 로그
        System.out.println(&quot;@@@### BServiceImpl.list() end&quot;);

//        return &quot;list&quot;;
        return list;
    }

    // 글쓰기 
    @Override
    public void write(HashMap&lt;String, String&gt; param) {
        System.out.println(&quot;@@@### BServiceImpl.write() start&quot;);

        //dao단 호출
        IBDao dao = sqlSession.getMapper(IBDao.class);
//        dao.write(request.getParameter(&quot;bName&quot;)
//                , request.getParameter(&quot;bTitle&quot;)
//                , request.getParameter(&quot;bContent&quot;));

        dao.write(param);//그냥 매개변수 param으로 넘기기



        System.out.println(&quot;@@@### BServiceImpl.write() end&quot;);

    }

}</code></pre>
<p>Servlet-content.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_mvc_board_std&quot; /&gt;


    &lt;!-- 추가된 부분 --&gt;

    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    

    &lt;beans:bean id=&quot;sqlSessionFactory&quot; class=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;mapperLocations&quot; value=&quot;classpath:com/javalec/spring_mvc_board_std/dao/mapper/*.xml&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean id=&quot;sqlSession&quot; class=&quot;org.mybatis.spring.SqlSessionTemplate&quot;&gt;
        &lt;beans:constructor-arg index=&quot;0&quot; ref=&quot;sqlSessionFactory&quot;&gt;&lt;/beans:constructor-arg&gt;
    &lt;/beans:bean&gt;

    &lt;!-- 추가된 부분 끝 --&gt;

&lt;/beans:beans&gt;</code></pre>
<p>pom.xml</p>
<pre><code class="language-java">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;!-- mybatis--&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
            &lt;version&gt;3.2.8&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis-spring&lt;/artifactId&gt;
            &lt;version&gt;1.2.2&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>list.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;번호&lt;/td&gt;
            &lt;td&gt;이름&lt;/td&gt;
            &lt;td&gt;제목&lt;/td&gt;
            &lt;td&gt;날짜&lt;/td&gt;
            &lt;td&gt;히트&lt;/td&gt;
        &lt;/tr&gt;
        &lt;c:forEach items=&quot;${list}&quot; var=&quot;dto&quot;&gt;
            &lt;tr&gt;
                &lt;td&gt;${dto.bId}&lt;/td&gt;
                &lt;td&gt;${dto.bName}&lt;/td&gt;
                &lt;td&gt;
                    &lt;a href=&quot;content_view?bId=${dto.bId}&quot;&gt;${dto.bTitle}&lt;/a&gt;
                &lt;/td&gt;
                &lt;td&gt;${dto.bDate}&lt;/td&gt;
                &lt;td&gt;${dto.bHit}&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;
        &lt;tr&gt;
            &lt;td colspan=&quot;5&quot;&gt;
                &lt;a href=&quot;write_view&quot;&gt;글작성&lt;/a&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>write.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;write&quot;&gt;&lt;!-- BController에서 write로 호출 해야함 --&gt;
            &lt;tr&gt;
                &lt;td&gt;이름&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bName&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;제목&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bTitle&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;내용&lt;/td&gt;
                &lt;td&gt;
                    &lt;textarea rows=&quot;10&quot; name=&quot;bContent&quot;&gt;&lt;/textarea&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;입력&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>-- 다음시간에 이어서</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.13 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.13-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.13-Spring</guid>
            <pubDate>Wed, 16 Nov 2022 05:43:45 GMT</pubDate>
            <description><![CDATA[<h1 id="char16-spring-jdbc">Char16. Spring JDBC</h1>
<h2 id="1-jdbc-template를-이용한-반복-코드-줄이기">1. JDBC Template를 이용한 반복 코드 줄이기</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ecc75bdf-cdbf-492c-910f-9ebba3c81197/image.png" alt=""></p>
<h2 id="2-spring-bean을-이용한-코드-간소화">2. Spring Bean을 이용한 코드 간소화</h2>
<h2 id="3-jdbc-template를-이용하기-위한-설정">3. JDBC Template를 이용하기 위한 설정</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/72f89cff-dcce-4d32-b74e-cb283fb165fa/image.png" alt=""></p>
<ul>
<li>com.javalec.spring_test_item_jdbc.util (패키지 추가)<ul>
<li>Constant.java(JdbcTemplate 빈 생성)</li>
</ul>
</li>
<li>Controller 단계<ul>
<li>JdbcTemplate 필드 및 setter(@Autowired) 설정</li>
</ul>
</li>
<li>Dao 단계<ul>
<li>JdbcTemplate 참조변수 추가 및 사용</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/2f8e8446-f2f8-48a6-819b-07f6a4aab649/image.png" alt=""></p>
<h3 id="예제-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/887f21f0-741a-4213-9840-cfed322c6715/image.png" alt=""></p>
<p>pom.xm</p>
<pre><code class="language-java">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_mvc_board_jdbc&quot; /&gt;

    &lt;!-- 추가된 부분 --&gt;
    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean name=&quot;template&quot; class=&quot;org.springframework.jdbc.core.JdbcTemplate&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    
    &lt;!-- 추가된 부분  끝!--&gt;

&lt;/beans:beans&gt;</code></pre>
<p>Constant.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.util;

import org.springframework.jdbc.core.JdbcTemplate;

public class Constant {
    public static JdbcTemplate template;
}</code></pre>
<p>BDto,java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.dto;

import java.sql.Timestamp;

public class BDto {
    int bId;
    String bName;
    String bTitle;
    String bContent;
    Timestamp bDate;
    int bHit;


    public BDto() {//기본 생성자

    }

    //필드를 사용한 생성자
    public BDto(int bId, String bName, String bTitle, String bContent, Timestamp bDate, int bHit) {
        super();
        this.bId = bId;
        this.bName = bName;
        this.bTitle = bTitle;
        this.bContent = bContent;
        this.bDate = bDate;
        this.bHit = bHit;
    }

    public int getbId() {
        return bId;
    }
    public void setbId(int bId) {
        this.bId = bId;
    }
    public String getbName() {
        return bName;
    }
    public void setbName(String bName) {
        this.bName = bName;
    }
    public String getbTitle() {
        return bTitle;
    }
    public void setbTitle(String bTitle) {
        this.bTitle = bTitle;
    }
    public String getbContent() {
        return bContent;
    }
    public void setbContent(String bContent) {
        this.bContent = bContent;
    }
    public Timestamp getbDate() {
        return bDate;
    }
    public void setbDate(Timestamp bDate) {
        this.bDate = bDate;
    }
    public int getbHit() {
        return bHit;
    }
    public void setbHit(int bHit) {
        this.bHit = bHit;
    }


}</code></pre>
<p>BDao java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.PreparedStatementSetter;

import com.javalec.spring_mvc_board_jdbc.dto.*;
//jdbc.dto.*;로됨
import com.javalec.spring_mvc_board_jdbc.util.Constant;

public class BDao {
//    DataSource dataSource;
    //이미 dataSource에 대한 정보는 template에 담았음
    JdbcTemplate template = null;


    public BDao() {//기본 생성자 생성
        template = Constant.template;
    }


        //list.jsp 조회하는 메소드
        public ArrayList&lt;BDto&gt; list(){
            //1번째 방법
//            ArrayList&lt;BDto&gt; dtos =null;
//            String sql = &quot;SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD&quot;;
//            dtos = (ArrayList&lt;BDto&gt;)template.query(sql, new BeanPropertyRowMapper(BDto.class));
//            return dtos;

            //2번째 방법
//            String sql = &quot;SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD&quot;;
//            return (ArrayList&lt;BDto&gt;)template.query(sql, new BeanPropertyRowMapper(BDto.class));

            //3번째 방법
            return (ArrayList&lt;BDto&gt;)template.query(&quot;SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD&quot;, new BeanPropertyRowMapper(BDto.class));

            // 세 방법 전부 결과는 동일함

        }

        //글작성 write 메소드?
        public void write(final String bName, final String bTitle,final String bContent) {
            //temple에서 변경 없이 쓰기 위해서 final을 붙임
            template.update(new PreparedStatementCreator() {

                @Override
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    String sql = &quot;INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bHit)\r\n&quot; + 
                               &quot; VALUES(MVC_BOARD_SEQ.NEXTVAL,?,?,?,0)&quot;;
                    PreparedStatement pstmt = con.prepareStatement(sql);
                    pstmt.setString(1, bName);
                    pstmt.setString(2, bTitle);
                    pstmt.setString(3, bContent);

                    return pstmt;
                }
            });
        }
//        
//        //글 내용을 보는 메소드
//        //글번호를 매개변수로 받음
        public BDto contentView(String strID) {
            upHit(strID);
            //pstmt.setInt(1, Integer.parseInt(strID))하지 않고 bId에 넣음
            String sql = &quot;SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD where bId=&quot;+strID;
            return template.queryForObject(sql, new BeanPropertyRowMapper&lt;BDto&gt;(BDto.class))
        }
//        
//        //조회수 증가 메소드
//        //어짜피 내부에서만 돌아가면 되는거라서 private로 메소드 생성함
        private void upHit(final String bId) {
            String sql = &quot;update MVC_BOARD set bHit = bHit + 1 where bId=?&quot;;
            template.update(sql,new PreparedStatementSetter() {

                @Override
                public void setValues(PreparedStatement ps) throws SQLException {
                    ps.setInt(1, Integer.parseInt(bId));//글번호 세팅, 캐스팅

                }
            });
        }
//        
//        //수정 메소드
//        //매개변수로 content_view에서 보낸 데이터들을 다 받는다.
        public void modify(final String bId, final String bName, final String bTitle, final String bContent) {
            String sql = &quot;update MVC_BOARD set bName = ?, bTitle = ?, bContent = ? where bId=?&quot;;
            template.update(sql, new PreparedStatementSetter() {

                @Override
                public void setValues(PreparedStatement ps) throws SQLException {
                    ps.setString(1, bName);//작성자 세팅
                    ps.setString(2, bTitle);//글제목 세팅
                    ps.setString(3, bContent);//글내용 세팅
                    ps.setInt(4, Integer.parseInt(bId));//글번호 세팅, 캐스팅

                }
            });
        }
//        
//        
        public void delete(final String strID) {
            String sql = &quot;delete from MVC_BOARD where bId=?&quot;;
            template.update(sql, new PreparedStatementSetter() {

                @Override
                public void setValues(PreparedStatement ps) throws SQLException {
                    ps.setInt(1, Integer.parseInt(strID));//글번호 세팅, 캐스팅

                }
            });
        }
}</code></pre>
<p>BService.java(인터페이스)</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.service;

import org.springframework.ui.Model;

public interface BService {
    public void execute(Model model); //선언
}</code></pre>
<p>BwriteService.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board_jdbc.dao.*;

public class BwriteService implements BService {
    @Override
    //이 메소드는 BController의 public String write(HttpServletRequest request, Model model) 로 보냄
    public void execute(Model model) {
        //Model에서 끌어와서 dao로 끌어보내야함
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);
        //모델에 리퀘스트를 담아서 커맨드로 보내면 됨

        //꺼내서 변수로 담음
        String bName = request.getParameter(&quot;bName&quot;);
        String bTitle = request.getParameter(&quot;bTitle&quot;);
        String bContent = request.getParameter(&quot;bContent&quot;);

        //그후 BDao로 받게 함
        BDao dao = new BDao();
        dao.write(bName, bTitle, bContent);

    }
}</code></pre>
<p>BModifyService.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board_jdbc.dao.*;

public class BModifyService implements BService{

    @Override
    public void execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request =(HttpServletRequest) map.get(&quot;request&quot;);

        //request.getParameter로 데이터 값들을 받아옴
        String bId = request.getParameter(&quot;bId&quot;);
        String bName = request.getParameter(&quot;bName&quot;);
        String bTitle = request.getParameter(&quot;bTitle&quot;);
        String bContent = request.getParameter(&quot;bContent&quot;);

        //DAO객체 생성하여 COMMAND와 연결
        BDao dao =new BDao();
        dao.modify(bId, bName, bTitle, bContent);
    }

}</code></pre>
<p>BListService.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.service;

import java.util.ArrayList;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board_jdbc.dao.*;
import com.javalec.spring_mvc_board_jdbc.dto.*;
//jdbc.dto.*;, jdbc.dao.*로됨

public class BListService implements BService{
    @Override
    public void execute(Model model) {
        //DAO 단 호출(패키치 DAO쪽 호출)
        BDao dao = new BDao();
        ArrayList&lt;BDto&gt; dtos = dao.list();//list 호출
        //모델 객체에 삽입
        model.addAttribute(&quot;list&quot;,dtos);
    }

}</code></pre>
<p>BDeleteService.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board_jdbc.dao.*;

public class BDeleteService implements BService{
    @Override
    public void execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();

        HttpServletRequest request =(HttpServletRequest) map.get(&quot;request&quot;);
        String bId = request.getParameter(&quot;bId&quot;);
        //동일하게 content_view의 삭제 쿼리스트링의 bid를 가지고 와야함

        BDao dao = new BDao();
        dao.delete(bId);//18번 줄의 String bId
    }

}</code></pre>
<p>BContentService.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board_jdbc.dao.*;
import com.javalec.spring_mvc_board_jdbc.dto.*;

public class BContentService implements BService{

    @Override
    public void execute(Model model) {
        //MAP 선언 후에 이  map 안에다가 모델 객체를 담음(요청처리
        Map&lt;String, Object&gt; map = model.asMap();
        //get으로 꺼냄
        HttpServletRequest request =(HttpServletRequest) map.get(&quot;request&quot;);

        //글번호를 가지고 옴
        //list.jsp의 bId로 가지고 와야함
        String bId = request.getParameter(&quot;bId&quot;);
        //list.jsp에서 제목 클릭시 글내용을 조회할 수있는 &lt;a href&gt;&lt;/a&gt;에서의 쿼리스트링에서 받은 bId를 가지고 와야함

        //BDao 호출하여 데이터 처리
        BDao dao =new BDao();
        //BAO에서 처리한 데이터를 객체화?
        BDto dto = dao.contentView(bId);//내용을 보여줌
//        //dao의 contentView메소드의 리턴값을 받아옴
//        
//        //결과값을 넘겨줘야하므로 model에 집어넣음
        model.addAttribute(&quot;content_view&quot;,dto);
    }

}</code></pre>
<p>BController,java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board_jdbc.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.javalec.spring_mvc_board_jdbc.service.BContentService;
import com.javalec.spring_mvc_board_jdbc.service.BDeleteService;
//import com.javalec.spring_mvc_board.command.BCommand;
//import com.javalec.spring_mvc_board.command.BContentCommand;
//import com.javalec.spring_mvc_board.command.BDeleteCommand;
//import com.javalec.spring_mvc_board.command.BListCommand;
//import com.javalec.spring_mvc_board.command.BModifyCommand;
//import com.javalec.spring_mvc_board.command.BWriteCommand;
import com.javalec.spring_mvc_board_jdbc.service.BListService;
import com.javalec.spring_mvc_board_jdbc.service.BModifyService;
import com.javalec.spring_mvc_board_jdbc.service.BService;
import com.javalec.spring_mvc_board_jdbc.service.BwriteService;
import com.javalec.spring_mvc_board_jdbc.util.Constant;

@Controller //어노테이션 -&gt; 컨트롤러  생성
public class BController {
//    BCommand command;//인터페이스? 생성?
    BService service;
    public JdbcTemplate template;


    @Autowired
    public void setTemplate(JdbcTemplate template) {
        //메소드의 매개변수인 template는 servlet-context.xml의  name의 template
        this.template = template;
        Constant.template = this.template;
    }

    //목록 조회
    @RequestMapping(&quot;/list&quot;)//url 받음
    public String list(Model model) {
        System.out.println(&quot;@@@### list()&quot;);

//        command = new BListCommand();
//        command.execute(model);//호출

        //service 단 호출(패키지 service 쪽 호출)
        service = new BListService();
        //service로(인터페이스) 수정 삭제 삽입등을 받으면 됨. 왜냐 인터페이스로 상속 받을 예정이기 때문
        service.execute(model);//호출

        return &quot;list&quot;;//결과값 받아서 화면 출력해야하기 때문에 list생성해야함

    }

    //글작성 페이지
    @RequestMapping(&quot;/write_view&quot;)//url 받음
    public String write_view() {
        System.out.println(&quot;@@@### write_view()&quot;);

        return &quot;write_view&quot;;//글쓰기 폼으로 이동

    }

    //글작성
    @RequestMapping(&quot;/write&quot;)//url 받음
    public String write(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### write()&quot;);

        //Model에 데이터 삽입
        model.addAttribute(&quot;request&quot;,request);
//        command = new BwriteService();
//        command.execute(model);

        service = new BwriteService();
        service.execute(model);


        return &quot;redirect:list&quot;;//글 목록 폼으로 이동
    }



//    //글 조회
    @RequestMapping(&quot;/content_view&quot;)//url 받음
    public String content_view(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### content_view()&quot;);

        //Model에 데이터(request)를 담아서 보냄.(BContentCommand로)
        model.addAttribute(&quot;request&quot;,request);
        //&quot;request&quot;는 BContentCommand.java의 20번째 줄의 &quot;request&quot;(글번호 가지고 오는 부분)
        //뒤의 request는 content_view 메소드의 매개변수인 HttpServletRequest request부분

//        command = new BContentCommand();
//        command.execute(model);

        service = new BContentService();
        service.execute(model);
        //커맨드 호출필요

        return &quot;content_view&quot;;//내용보는 페이지로 이동
    }
//    
//    
//    //글수정
    @RequestMapping(&quot;/modify&quot;)//url 받음
    public String modify(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### modify()&quot;);

        model.addAttribute(&quot;request&quot;,request);
        //command단 호출
        //Interface command 사용
//        command = new BModifyCommand();
//        command.execute(model);//호출

        service = new BModifyService();
        service.execute(model);

        return &quot;redirect:list&quot;;//글 목록 폼으로 이동
    }
//    
//    
//    
//    //글 삭제
    @RequestMapping(&quot;/delete&quot;)//url 받음
    public String delete(HttpServletRequest request, Model model) {
        //여기 매개변수의 request는 bId가 들어있음
        System.out.println(&quot;@@@### delete()&quot;);

        model.addAttribute(&quot;request&quot;,request);

//        command = new BDeleteCommand();
//        command.execute(model);//호출

        service = new BDeleteService();
        service.execute(model);

        return &quot;redirect:list&quot;;//글 목록 폼으로 이동
    }
}</code></pre>
<p>content_view.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;write&quot;&gt;&lt;!-- BController에서 write로 호출 해야함 --&gt;
            &lt;tr&gt;
                &lt;td&gt;이름&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bName&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;제목&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bTitle&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;내용&lt;/td&gt;
                &lt;td&gt;
                    &lt;textarea rows=&quot;10&quot; name=&quot;bContent&quot;&gt;&lt;/textarea&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;입력&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>list.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;write&quot;&gt;&lt;!-- BController에서 write로 호출 해야함 --&gt;
            &lt;tr&gt;
                &lt;td&gt;이름&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bName&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;제목&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bTitle&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;내용&lt;/td&gt;
                &lt;td&gt;
                    &lt;textarea rows=&quot;10&quot; name=&quot;bContent&quot;&gt;&lt;/textarea&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;입력&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>write_view.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;write&quot;&gt;&lt;!-- BController에서 write로 호출 해야함 --&gt;
            &lt;tr&gt;
                &lt;td&gt;이름&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bName&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;제목&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bTitle&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;내용&lt;/td&gt;
                &lt;td&gt;
                    &lt;textarea rows=&quot;10&quot; name=&quot;bContent&quot;&gt;&lt;/textarea&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;입력&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h3 id="예제-2">예제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/2c7694f4-2348-4f11-a66d-cd99f3575b5c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/471e50a8-25ed-425f-a484-b2edb7f8fb90/image.png" alt=""></p>
<p>pom.xm</p>
<pre><code class="language-java">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_mvc_board_jdbc&quot; /&gt;

    &lt;!-- 추가된 부분 --&gt;
    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean name=&quot;template&quot; class=&quot;org.springframework.jdbc.core.JdbcTemplate&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    
    &lt;!-- 추가된 부분  끝!--&gt;

&lt;/beans:beans&gt;</code></pre>
<p>Constant.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item_jdbc.util;

import org.springframework.jdbc.core.JdbcTemplate;

public class Constant {
    public static JdbcTemplate template;


}</code></pre>
<p>ItemDto.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item_jdbc.dto;

public class ItemDto {
    String name;
    int price;
    String description;

    public ItemDto() {
        // TODO Auto-generated constructor stub
    }

    public ItemDto(String name, int price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

}</code></pre>
<p>ItemDao.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item_jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.PreparedStatementSetter;

import com.javalec.spring_test_item_jdbc.util.Constant;
import com.javalec.spring_test_item_jdbc.dto.*;

public class ItemDao {
    JdbcTemplate template = null;

    public ItemDao() {
        template = Constant.template;
    }

    //작성
    public void write(final String name, final int price, final String description) {
        template.update(new PreparedStatementCreator() {

            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                String sql=&quot;insert into item(name, price, description) values(?,?,?)&quot;;
                PreparedStatement pstmt = con.prepareStatement(sql);
                pstmt.setString(1, name);
                pstmt.setInt(2, price);
                pstmt.setString(3, description);
                return pstmt;
            }
        });
    }

    public ArrayList&lt;ItemDto&gt; contentView(){
        //내가 한 방법
//        ArrayList&lt;ItemDto&gt; dtos =null;
//        String sql=&quot;select name, price, description from item&quot;;
//        dtos =(ArrayList&lt;ItemDto&gt;)template.query(sql, new BeanPropertyRowMapper(ItemDto.class));
//        
//        return dtos;

        //강사님이 한 방법
        String sql=&quot;select name, price, description from item&quot;;
        return (ArrayList&lt;ItemDto&gt;)template.query(sql, new BeanPropertyRowMapper(ItemDto.class));
    }
}</code></pre>
<p>ItemController.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item_jdbc.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.javalec.spring_test_item_jdbc.util.Constant;
import com.javalec.spring_test_item_jdbc.service.ItemContentService;
import com.javalec.spring_test_item_jdbc.service.ItemService;
import com.javalec.spring_test_item_jdbc.service.ItemWriteService;

@Controller
public class ItemController {
    ItemService service;

    public JdbcTemplate template;


    @Autowired
    public void setTemplate(JdbcTemplate template) {
        //메소드의 매개변수인 template는 servlet-context.xml의  name의 template
        this.template = template;
        Constant.template = this.template;
    }

    @RequestMapping(&quot;/write&quot;)
    public String write() {
        System.out.println(&quot;@@@### write()&quot;);

        return &quot;itemWrite&quot;;
    }
    /////////////////////////////////////////////////////////////


    @RequestMapping(&quot;/writeResult&quot;)
    public String writeResult(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### writeResult()&quot;);

        model.addAttribute(&quot;request&quot;, request);
        service = new ItemWriteService();
        service.execute(model);

        return &quot;writeResult&quot;;
    }

    @RequestMapping(&quot;/content_view&quot;)
    public String content_view(Model model) {
        System.out.println(&quot;@@@### content_view()&quot;);

        service = new ItemContentService();
        service.execute(model);

        return &quot;content_view&quot;;
    }

}</code></pre>
<p>ItemService.java(인터페이스)</p>
<pre><code class="language-java">package com.javalec.spring_test_item_jdbc.service;

import org.springframework.ui.Model;

public interface ItemService {
    public void execute(Model model);
}</code></pre>
<p>ItemContentService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item_jdbc.service;

import java.util.ArrayList;

import org.springframework.ui.Model;

import com.javalec.spring_test_item_jdbc.dao.*;
import com.javalec.spring_test_item_jdbc.dto.*;

public class ItemContentService implements ItemService{

    @Override
    public void execute(Model model) {
        ItemDao dao = new ItemDao();
        ArrayList&lt;ItemDto&gt; dtos = dao.contentView();
        model.addAttribute(&quot;content_view&quot;, dtos);
    }

}</code></pre>
<p>ItemWriteService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item_jdbc.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_test_item_jdbc.dao.*;

public class ItemWriteService implements ItemService{

    @Override
    public void execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);

        String name = request.getParameter(&quot;name&quot;);
        int price = Integer.parseInt(request.getParameter(&quot;price&quot;));
        String description = request.getParameter(&quot;description&quot;);

        ItemDao dao = new ItemDao();
        dao.write(name, price, description);
    }

}</code></pre>
<p>content_view.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;상품명&lt;/td&gt;
            &lt;td&gt;가격&lt;/td&gt;
            &lt;td&gt;설명&lt;/td&gt;
        &lt;/tr&gt;
        &lt;c:forEach items=&quot;${content_view}&quot; var=&quot;dto&quot;&gt;
            &lt;tr&gt;
                &lt;td&gt;${dto.name}&lt;/td&gt;
                &lt;td&gt;${dto.price}&lt;/td&gt;
                &lt;td&gt;${dto.description}&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>itemWrite.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form method=&quot;post&quot; action=&quot;writeResult&quot;&gt;
        &lt;table&gt;
            &lt;tr&gt;
                &lt;td&gt;상품명&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;가격&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;price&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;설명&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;description&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;전송&quot;&gt;
                    &lt;input type=&quot;reset&quot; value=&quot;취소&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>writeResult.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;a href=&quot;content_view&quot;&gt;결과 보기&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h3 id="예제-3">예제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/70acb393-5873-4268-b78f-02ee3334f46a/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/a2556956-25b2-486d-8a4c-de7a7e865aca/image.png" alt=""></p>
<p>pom.xm</p>
<pre><code class="language-java">&lt;!-- JDBC Template --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
            &lt;version&gt;4.1.4.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_mvc_board_jdbc&quot; /&gt;

    &lt;!-- 추가된 부분 --&gt;
    &lt;beans:bean name=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
        &lt;beans:property name=&quot;driverClassName&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;url&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;username&quot; value=&quot;scott&quot;&gt;&lt;/beans:property&gt;
        &lt;beans:property name=&quot;password&quot; value=&quot;tiger&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;

    &lt;beans:bean name=&quot;template&quot; class=&quot;org.springframework.jdbc.core.JdbcTemplate&quot;&gt;
        &lt;beans:property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;&gt;&lt;/beans:property&gt;
    &lt;/beans:bean&gt;    
    &lt;!-- 추가된 부분  끝!--&gt;

&lt;/beans:beans&gt;</code></pre>
<p>Constant.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.util;

import org.springframework.jdbc.core.JdbcTemplate;

public class Constant {
    public static JdbcTemplate template;
}</code></pre>
<p>MemDto.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.dto;

public class MemDto {
    String mem_uid;
    String mem_pwd;
    String mem_name;


    public MemDto(String mem_uid, String mem_pwd, String mem_name) {
        super();
        this.mem_uid = mem_uid;
        this.mem_pwd = mem_pwd;
        this.mem_name = mem_name;
    }

    public String getMem_uid() {
        return mem_uid;
    }

    public void setMem_uid(String mem_uid) {
        this.mem_uid = mem_uid;
    }

    public String getMem_pwd() {
        return mem_pwd;
    }

    public void setMem_pwd(String mem_pwd) {
        this.mem_pwd = mem_pwd;
    }

    public String getMem_name() {
        return mem_name;
    }

    public void setMem_name(String mem_name) {
        this.mem_name = mem_name;
    }

    public MemDto() {

    }


}</code></pre>
<p>MemDao.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;

import com.javalec.spring_test_member_jdbc.dto.MemDto;
import com.javalec.spring_test_member_jdbc.util.Constant;

public class MemDao {
    JdbcTemplate template = null;

    public MemDao() {
        template = Constant.template;
    }

    public int loginYn( String id, String pw) {


        String sql = &quot;SELECT mem_pwd FROM MVC_MEMBER WHERE mem_uid=&#39;&quot;+id+&quot;&#39;&quot;;
        int re = -1;


        try {

            String db_pwd = template.queryForObject(sql, String.class);//String 변수로 받을 class(
            if (db_pwd.equals(pw)) {//패스워드도  일치
                re = 1;
            }else {//패스워드가 불일치
                re=0  ;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return re;
    }


       public void write(final String mem_uid, final String mem_pwd, final String mem_name) {
              template.update(new PreparedStatementCreator() {

                 @Override
                 public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    String sql = &quot;INSERT INTO MVC_MEMBER(mem_uid, mem_pwd, mem_name)\r\n&quot; + 
                             &quot; VALUES(?,?,?)&quot;;
                    PreparedStatement pstmt = con.prepareStatement(sql);
                    pstmt.setString(1, mem_uid);
                    pstmt.setString(2, mem_pwd);
                    pstmt.setString(3, mem_name);

                    return pstmt;
                 }
              });
           }

}</code></pre>
<p>MemController.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.javalec.spring_test_member_jdbc.util.Constant;
import com.javalec.spring_test_member_jdbc.service.*;

@Controller
public class MemController {
    MemService service;
    public JdbcTemplate template;

    @Autowired
    public void setTemplate(JdbcTemplate template) {
        //메소드의 매개변수인 template는 servlet-context.xml의  name의 template
        this.template = template;
        Constant.template = this.template;
    }


    @RequestMapping(&quot;/login&quot;)
    public String login() {
        System.out.println(&quot;###@@@ login()&quot;);

        return &quot;login&quot;;
    }

    @RequestMapping(&quot;/login_yn&quot;)
    public String login_yn(HttpServletRequest request, Model model) {
        System.out.println(&quot;###@@@ login_yn()&quot;);

        model.addAttribute(&quot;request&quot;,request);
        service =  new MemLoginService();
        int result = service.execute(model);

        //분기처리
        if (result == 1) {
            return &quot;redirect:login_ok&quot;;//로그인 성공시 이동
        }
        return &quot;redirect:login&quot;;//로그인 실패시 그자리에 그대로 있음
    }

    @RequestMapping(&quot;/login_ok&quot;)
    public String login_ok() {
        System.out.println(&quot;###@@@ login_ok()&quot;);

        return &quot;login_ok&quot;;
    }


    @RequestMapping(&quot;/register&quot;)
    public String register() {
        System.out.println(&quot;###@@@ register()&quot;);

        return &quot;register&quot;;
    }


    @RequestMapping(&quot;/registerOk&quot;)
    public String registerOk(HttpServletRequest request, Model model) {// 값을 받기위해 파라미터 넣음
        System.out.println(&quot;###@@@ registerOk&quot;);

        model.addAttribute(&quot;request&quot;,request);
        service = new MWriteService();
        service.execute(model);

        return &quot;redirect:login&quot;;
    }


}</code></pre>
<p>MemService.java(인터페이스)</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.service;

import org.springframework.ui.Model;

public interface MemService {
    public int execute(Model model);
}</code></pre>
<p>MWriteService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_test_member_jdbc.dao.MemDao;

public class MWriteService implements MemService{

    @Override
    public int execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);

        String mem_uid = request.getParameter(&quot;mem_uid&quot;);
        String mem_pwd = request.getParameter(&quot;mem_pwd&quot;);
        String mem_name = request.getParameter(&quot;mem_name&quot;);


        MemDao dao = new MemDao();
        dao.write(mem_uid, mem_pwd, mem_name);

        return 0;
    }

}</code></pre>
<p>MemLoginService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_test_member_jdbc.dao.*;

public class MemLoginService implements MemService {

    @Override
    public int execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);

        String mId = request.getParameter(&quot;mem_uid&quot;);
        String mPw = request.getParameter(&quot;mem_pwd&quot;);

        MemDao dao = new MemDao();//객체 생성
        int re = dao.loginYn(mId, mPw);

        return re;
    }

}</code></pre>
<p>login_ok.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;login ok~~!!!&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>login.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table border=&quot;1&quot;  align=&quot;center&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;login_yn&quot; &gt;
            &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;100&quot;&gt;
                     사용자 ID 
                 &lt;/td&gt;
                 &lt;td width=&quot;100&quot;&gt;
                     &lt;input type=&quot;text&quot; name=&quot;mem_uid&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td width=&quot;100&quot;&gt;
                      비밀번호 
                 &lt;/td&gt;
                 &lt;td width=&quot;100&quot;&gt;
                      &lt;input type=&quot;text&quot; name=&quot;mem_pwd&quot; &gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td colspan = &quot;2&quot; align=&quot;center&quot;&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;로그인&quot;&gt;
                      &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
                      &lt;!-- &lt;input type=&quot;button&quot; value=&quot;회원가입&quot;&gt; --&gt;
                      &lt;a href=&quot;register&quot;&gt;회원 가입&lt;/a&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>register.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table  border=&quot;1&quot; align =&quot;center&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;registerOk&quot;&gt;
            &lt;tr height=&quot;50&quot;&gt;
                 &lt;td colspan = &quot;2&quot;&gt;
                     &lt;h1&gt;회원 가입 신청&lt;/h1&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;

             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;User ID&lt;/td &gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;20&quot; name=&quot;mem_uid&quot; &gt;&lt;/td&gt;
             &lt;/tr&gt;

             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;암호&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;password&quot; size =&quot;20&quot; name=&quot;mem_pwd&quot;&gt;&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;이     름&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;20&quot; name= &quot;mem_name&quot;&gt;&lt;/td&gt;
             &lt;/tr&gt;
                 &lt;td colspan = &quot;2&quot;&gt;
                      &lt;input type=&quot;submit&quot; value=&quot;등록&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>또는 </p>
<p>MemLoginService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.service;

import java.util.ArrayList;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_test_member_jdbc.dao.*;
import com.javalec.spring_test_member_jdbc.dto.MemDto;

public class MemLoginService implements MemService {

    @Override
    public int execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);

        String mId = request.getParameter(&quot;mem_uid&quot;);
        String mPw = request.getParameter(&quot;mem_pwd&quot;);
        int re;

        MemDao dao = new MemDao();//객체 생성
//        int re = dao.loginYn(mId, mPw);


        //MemDao.java의 loginYn 메소드 위의 부분(검증 안하는 부분)에서 넘어온 결과를 서비스단인 MemLoginService에서 확인
        ArrayList&lt;MemDto&gt; dtos = dao.loginYn(mId, mPw);
        //비밀번호 검증
        if (dtos.isEmpty()) {
            re=-1;
        }else {
            if (mPw.equals(dtos.get(0).getMem_pwd())) {
                re = 1;
            }else {
                re =0;
            }
        }

        return re;
    }

}</code></pre>
<p>MemDao.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member_jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;

import com.javalec.spring_test_member_jdbc.dto.MemDto;
import com.javalec.spring_test_member_jdbc.util.Constant;

public class MemDao {
    JdbcTemplate template = null;

    public MemDao() {
        template = Constant.template;
    }

//    public int loginYn( String id, String pw) {
    public ArrayList&lt;MemDto&gt; loginYn( String id, String pw) {
    String sql = &quot;SELECT mem_pwd FROM MVC_MEMBER WHERE mem_uid=&#39;&quot;+id+&quot;&#39;&quot;;
    return (ArrayList&lt;MemDto&gt;) template.query(sql, new BeanPropertyRowMapper(MemDto.class));
    //캐스팅
    // 위의 경우 받는 쪽인(서비스단)에서 처리되도록 함.
    // 비밀번호 검증 안함 


    //비밀번호검증까지 함
//    String sql = &quot;SELECT mem_pwd FROM MVC_MEMBER WHERE mem_uid=&#39;&quot;+id+&quot;&#39;&quot;;
//        int re = -1;
//        
//        try {
//            String db_pwd = template.queryForObject(sql, String.class);//String 변수로 받을 class(
//            if (db_pwd.equals(pw)) {//패스워드도  일치
//                re = 1;
//            }else {//패스워드가 불일치
//                re=0  ;
//            }
//            
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return re;
    }


       public void write(final String mem_uid, final String mem_pwd, final String mem_name) {
              template.update(new PreparedStatementCreator() {

                 @Override
                 public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    String sql = &quot;INSERT INTO MVC_MEMBER(mem_uid, mem_pwd, mem_name)\r\n&quot; + 
                             &quot; VALUES(?,?,?)&quot;;
                    PreparedStatement pstmt = con.prepareStatement(sql);
                    pstmt.setString(1, mem_uid);
                    pstmt.setString(2, mem_pwd);
                    pstmt.setString(3, mem_name);

                    return pstmt;
                 }
              });
           }

}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.12 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.12-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.12-Spring</guid>
            <pubDate>Wed, 16 Nov 2022 05:43:33 GMT</pubDate>
            <description><![CDATA[<ul>
<li>저번시간에 이어서 </li>
</ul>
<p>BContentCommand의 약 19번째 줄
<img src="https://velog.velcdn.com/images/sofia_777/post/e63ed9ae-5a35-4643-95dd-9d1b6648dae4/image.png" alt="">
24번째 줄
<img src="https://velog.velcdn.com/images/sofia_777/post/6d561c3b-8729-43e4-8137-c66b1bb1ec87/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/26a31f24-a311-4beb-b431-1bc0d908588d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b5960964-d2d9-4424-806b-77732cb21553/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/3453aad0-3cc2-4c56-8d2a-7d55d360053d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/e528100a-46df-4017-ac64-381329e267f0/image.png" alt=""></p>
<p>--- 최종 정리본
<img src="https://velog.velcdn.com/images/sofia_777/post/976a2306-d99f-4abf-a034-a394b2f1a140/image.png" alt=""></p>
<p>com.javalec.spring_mvc_board.command</p>
<p>BCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import org.springframework.ui.Model;

public interface BCommand {//인터페이스
    public void execute(Model model); //선언
}</code></pre>
<p>BContentCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board.dao.BDao;
import com.javalec.spring_mvc_board.dto.BDto;

//게시글 목록에서 제목 클릭시 해당 글을 보여주는 작업
public class BContentCommand implements BCommand {

    @Override
    public void execute(Model model) {
        //MAP 선언 후에 이  map 안에다가 모델 객체를 담음(요청처리
        Map&lt;String, Object&gt; map = model.asMap();
        //get으로 꺼냄
        HttpServletRequest request =(HttpServletRequest) map.get(&quot;request&quot;);

        //글번호를 가지고 옴
        //list.jsp의 bId로 가지고 와야함
        String bId = request.getParameter(&quot;bId&quot;);
        //list.jsp에서 제목 클릭시 글내용을 조회할 수있는 &lt;a href&gt;&lt;/a&gt;에서의 쿼리스트링에서 받은 bId를 가지고 와야함

        //BDao 호출하여 데이터 처리
        BDao dao =new BDao();
        //BAO에서 처리한 데이터를 객체화?
        BDto dto = dao.contentView(bId);//내용을 보여줌
        //dao의 contentView메소드의 리턴값을 받아옴

        //결과값을 넘겨줘야하므로 model에 집어넣음
        model.addAttribute(&quot;content_view&quot;,dto);
    }

}</code></pre>
<p>BDeleteCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board.dao.BDao;

public class BDeleteCommand implements BCommand{

    @Override
    public void execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();

        HttpServletRequest request =(HttpServletRequest) map.get(&quot;request&quot;);
        String bId = request.getParameter(&quot;bId&quot;);
        //동일하게 content_view의 삭제 쿼리스트링의 bid를 가지고 와야함

        BDao dao = new BDao();
        dao.delete(bId);//18번 줄의 String bId
    }

}</code></pre>
<p>BListCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import java.util.ArrayList;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board.dao.BDao;
import com.javalec.spring_mvc_board.dto.BDto;

public class BListCommand implements BCommand {

    @Override
    public void execute(Model model) {
        //DAO 단 호출(패키치 DAO쪽 호출)

        BDao dao = new BDao();
        ArrayList&lt;BDto&gt; dtos = dao.list();//list 호출
        //모델 객체에 삽입
        model.addAttribute(&quot;list&quot;,dtos);
    }

}</code></pre>
<p>BModifyCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board.dao.BDao;

public class BModifyCommand implements BCommand{

    @Override
    public void execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request =(HttpServletRequest) map.get(&quot;request&quot;);

        //request.getParameter로 데이터 값들을 받아옴
        String bId = request.getParameter(&quot;bId&quot;);
        String bName = request.getParameter(&quot;bName&quot;);
        String bTitle = request.getParameter(&quot;bTitle&quot;);
        String bContent = request.getParameter(&quot;bContent&quot;);

        //DAO객체 생성하여 COMMAND와 연결
        BDao dao =new BDao();
        dao.modify(bId, bName, bTitle, bContent);
    }

}</code></pre>
<p>BWriteCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board.dao.BDao;

public class BWriteCommand implements BCommand{

    @Override
    //이 메소드는 BController의 public String write(HttpServletRequest request, Model model) 로 보냄
    public void execute(Model model) {
        //Model에서 끌어와서 dao로 끌어보내야함
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);
        //모델에 리퀘스트를 담아서 커맨드로 보내면 됨

        //꺼내서 변수로 담음
        String bName = request.getParameter(&quot;bName&quot;);
        String bTitle = request.getParameter(&quot;bTitle&quot;);
        String bContent = request.getParameter(&quot;bContent&quot;);

        //그후 BDao로 받게 함
        BDao dao = new BDao();
        dao.write(bName, bTitle, bContent);

    }

}</code></pre>
<p><strong>com.javalec.spring_mvc_board.controller</strong></p>
<p>BController.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.controller;

import javax.servlet.http.HttpServletRequest;

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

import com.javalec.spring_mvc_board.command.BCommand;
import com.javalec.spring_mvc_board.command.BContentCommand;
import com.javalec.spring_mvc_board.command.BDeleteCommand;
import com.javalec.spring_mvc_board.command.BListCommand;
import com.javalec.spring_mvc_board.command.BModifyCommand;
import com.javalec.spring_mvc_board.command.BWriteCommand;

@Controller //어노테이션 -&gt; 컨트롤러  생성
public class BController {
    BCommand command;//인터페이스? 생성?

    //목록 조회
    @RequestMapping(&quot;/list&quot;)//url 받음
    public String list(Model model) {
        System.out.println(&quot;@@@### list()&quot;);

        //command 단 호출(패키지 command 쪽 호출)

        command = new BListCommand();
        //command로(인터페이스) 수정 삭제 삽입등을 받으면 됨. 왜냐 인터페이스로 상속 받을 예정이기 때문
        command.execute(model);//호출

        return &quot;list&quot;;//결과값 받아서 화면 출력해야하기 때문에 list생성해야함

    }

    //글작성 페이지
    @RequestMapping(&quot;/write_view&quot;)//url 받음
    public String write_view() {
        System.out.println(&quot;@@@### write_view()&quot;);

        return &quot;write_view&quot;;//글쓰기 폼으로 이동

    }

    //글작성
    @RequestMapping(&quot;/write&quot;)//url 받음
    public String write(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### write()&quot;);

        //Model에 데이터 삽입
        model.addAttribute(&quot;request&quot;,request);

        command = new BWriteCommand();
        command.execute(model);

        return &quot;redirect:list&quot;;//글 목록 폼으로 이동
    }

    //글 조회
    @RequestMapping(&quot;/content_view&quot;)//url 받음
    public String content_view(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### content_view()&quot;);

        //Model에 데이터(request)를 담아서 보냄.(BContentCommand로)
        model.addAttribute(&quot;request&quot;,request);
        //&quot;request&quot;는 BContentCommand.java의 20번째 줄의 &quot;request&quot;(글번호 가지고 오는 부분)
        //뒤의 request는 content_view 메소드의 매개변수인 HttpServletRequest request부분


        command = new BContentCommand();
        command.execute(model);
        //커맨드 호출필요

        return &quot;content_view&quot;;//내용보는 페이지로 이동
    }


    //글수정
    @RequestMapping(&quot;/modify&quot;)//url 받음
    public String modify(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### modify()&quot;);

        model.addAttribute(&quot;request&quot;,request);
        //command단 호출
        //Interface command 사용
        command = new BModifyCommand();
        command.execute(model);//호출

        return &quot;redirect:list&quot;;//글 목록 폼으로 이동
    }



    //글 삭제
    @RequestMapping(&quot;/delete&quot;)//url 받음
    public String delete(HttpServletRequest request, Model model) {
        //여기 매개변수의 request는 bId가 들어있음
        System.out.println(&quot;@@@### delete()&quot;);

        model.addAttribute(&quot;request&quot;,request);

        command = new BDeleteCommand();
        command.execute(model);//호출

        return &quot;redirect:list&quot;;//글 목록 폼으로 이동
    }
}</code></pre>
<p><strong>com.javalec.spring_mvc_board.dao</strong></p>
<p>BDao.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.javalec.spring_mvc_board.dto.BDto;

public class BDao {
    DataSource dataSource;

    public BDao() {//기본 생성자 생성

        try {
            Context contex = new InitialContext();
            dataSource = (DataSource) contex.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

        //list.jsp 조회하는 메소드
        public ArrayList&lt;BDto&gt; list(){
            ArrayList&lt;BDto&gt; dtos = new ArrayList&lt;BDto&gt;();

            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;

            try {
                conn = dataSource.getConnection();
                String sql = &quot;SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD&quot;;
                pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery();


                while (rs.next()) {//결과값받기
                    int bId = rs.getInt(&quot;bId&quot;);
                    String bName = rs.getString(&quot;bName&quot;);
                    String bTitle = rs.getString(&quot;bTitle&quot;);
                    String bContent = rs.getString(&quot;bContent&quot;);
                    Timestamp bDate = rs.getTimestamp(&quot;bDate&quot;);
                    int bHit = rs.getInt(&quot;bHit&quot;);

                    BDto dto = new BDto(bId, bName, bTitle, bContent, bDate, bHit);
                    dtos.add(dto);//arraylist에 추가

                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (rs != null) rs.close();
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
            return dtos;//command쪽의  execute메소드로로 이동
        }

        //글작성 write 메소드?
        public void write(String bName, String bTitle,String bContent) {
            Connection conn = null;
            PreparedStatement pstmt = null;

            try {
                conn = dataSource.getConnection();
                //글 삽입 쿼리문
//                String sql = &quot;INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bDate, bHit) \r\n&quot; + 
//                        &quot; VALUES(MVC_BOARD_SEQ.NEXTVAL,?,?,?,0)&quot;;

                String sql = &quot;INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bHit)\r\n&quot; + 
                           &quot; VALUES(MVC_BOARD_SEQ.NEXTVAL,?,?,?,0)&quot;;


                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, bName);
                pstmt.setString(2, bTitle);
                pstmt.setString(3, bContent);
                pstmt.executeUpdate();
                //wirte.jsp에서 삽입되는 데이터들 세팅


            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }

        //글 내용을 보는 메소드
        //글번호를 매개변수로 받음
        public BDto contentView(String strID) {
            upHit(strID);
            //조회할때 strID를 넘기면 조회수가 증가함(upHit메소드)

            BDto dto = null;
            //초기값 설정

            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;

            try {
                conn = dataSource.getConnection();
                String sql = &quot;SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD where bId=?&quot;;
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, Integer.parseInt(strID));//캐스팅 + ?에 데이터 삽입
                rs = pstmt.executeQuery();


                while (rs.next()) {//결과값받기
                    int bId = rs.getInt(&quot;bId&quot;);
                    String bName = rs.getString(&quot;bName&quot;);
                    String bTitle = rs.getString(&quot;bTitle&quot;);
                    String bContent = rs.getString(&quot;bContent&quot;);
                    Timestamp bDate = rs.getTimestamp(&quot;bDate&quot;);
                    int bHit = rs.getInt(&quot;bHit&quot;);

                    dto = new BDto(bId, bName, bTitle, bContent, bDate, bHit);
                    //위에서 만든 dto를 리턴

                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (rs != null) rs.close();
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
            return dto;//command쪽의  execute메소드로로 이동
        }

        //조회수 증가 메소드
        //어짜피 내부에서만 돌아가면 되는거라서 private로 메소드 생성함
        private void upHit(String bId) {
            Connection conn = null;
            PreparedStatement pstmt = null;

            try {
                conn = dataSource.getConnection();
                //업데이트문사용하여 조회수 증가
                String sql = &quot;update MVC_BOARD set bHit = bHit + 1 where bId=?&quot;;

                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, Integer.parseInt(bId));//글번호 세팅, 캐스팅
                pstmt.executeUpdate();

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }

        //수정 메소드
        //매개변수로 content_view에서 보낸 데이터들을 다 받는다.
        public void modify(String bId, String bName, String bTitle, String bContent) {
            Connection conn = null;
            PreparedStatement pstmt = null;

            try {
                conn = dataSource.getConnection();
                //업데이트문사용하여 수정문 생성
                String sql = &quot;update MVC_BOARD set bName = ?, bTitle = ?, bContent = ? where bId=?&quot;;

                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, bName);//작성자 세팅
                pstmt.setString(2, bTitle);//글제목 세팅
                pstmt.setString(3, bContent);//글내용 세팅
                pstmt.setInt(4, Integer.parseInt(bId));//글번호 세팅, 캐스팅
                pstmt.executeUpdate();

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }


        public void delete(String strID) {
            Connection conn = null;
            PreparedStatement pstmt = null;

            try {
                conn = dataSource.getConnection();
                String sql = &quot;delete from MVC_BOARD where bId=?&quot;;
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, Integer.parseInt(strID));//글번호 세팅, 캐스팅
                pstmt.executeUpdate();

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }
}</code></pre>
<p><strong>com.javalec.spring_mvc_board.dto</strong></p>
<p>BDto.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.dto;

import java.sql.Timestamp;

public class BDto {
    int bId;
    String bName;
    String bTitle;
    String bContent;
    Timestamp bDate;
    int bHit;


    public BDto() {//기본 생성자

    }

    //필드를 사용한 생성자
    public BDto(int bId, String bName, String bTitle, String bContent, Timestamp bDate, int bHit) {
        super();
        this.bId = bId;
        this.bName = bName;
        this.bTitle = bTitle;
        this.bContent = bContent;
        this.bDate = bDate;
        this.bHit = bHit;
    }

    public int getbId() {
        return bId;
    }
    public void setbId(int bId) {
        this.bId = bId;
    }
    public String getbName() {
        return bName;
    }
    public void setbName(String bName) {
        this.bName = bName;
    }
    public String getbTitle() {
        return bTitle;
    }
    public void setbTitle(String bTitle) {
        this.bTitle = bTitle;
    }
    public String getbContent() {
        return bContent;
    }
    public void setbContent(String bContent) {
        this.bContent = bContent;
    }
    public Timestamp getbDate() {
        return bDate;
    }
    public void setbDate(Timestamp bDate) {
        this.bDate = bDate;
    }
    public int getbHit() {
        return bHit;
    }
    public void setbHit(int bHit) {
        this.bHit = bHit;
    }


}</code></pre>
<p><strong>content_view.jsp</strong></p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
            &lt;form method=&quot;post&quot; action=&quot;modify&quot;&gt;
                &lt;input type=&quot;hidden&quot; name=&quot;bId&quot; value=&quot;${content_view.bId}&quot;&gt;
                &lt;!-- 글번호 데이터도 가지고 가야하지만 수정되면 안되므로(PK) hidden을 사용하여 안보이게 함 --&gt;
                &lt;tr&gt;
                    &lt;td&gt;번호&lt;/td&gt;
                    &lt;!-- 쿼리 결과값을 BContentCommand의 리턴 값에 받았음 --&gt;&lt;!--  31번째 줄--&gt;
                    &lt;td&gt;${content_view.bId}&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;히트&lt;/td&gt;
                    &lt;!-- 쿼리 결과값을 BContentCommand의 리턴 값에 받았음 --&gt;
                    &lt;td&gt;${content_view.bHit}&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;이름&lt;/td&gt;
                    &lt;!-- 쿼리 결과값을 BContentCommand의 리턴 값에 받았음 --&gt;
                    &lt;td&gt;
                        &lt;input type=&quot;text&quot; name=&quot;bName&quot; value=&quot;${content_view.bName}&quot;&gt;
                        &lt;!-- bName를 가지고 가야하므로 --&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;제목&lt;/td&gt;
                    &lt;!-- 쿼리 결과값을 BContentCommand의 리턴 값에 받았음 --&gt;
                    &lt;td&gt;
                        &lt;input type=&quot;text&quot; name=&quot;bTitle&quot; value=&quot;${content_view.bTitle}&quot;&gt;
                        &lt;!-- bTitle를 가지고 가야하므로 --&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;내용&lt;/td&gt;
                    &lt;!-- 쿼리 결과값을 BContentCommand의 리턴 값에 받았음 --&gt;
                    &lt;td&gt;
                        &lt;input type=&quot;text&quot; name=&quot;bContent&quot; value=&quot;${content_view.bContent}&quot;&gt;
                        &lt;!-- bContent를 가지고 가야하므로 --&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;2&quot;&gt;
                        &lt;input type=&quot;submit&quot; value=&quot;수정&quot;&gt;
                        &amp;nbsp;&amp;nbsp;&lt;a href=&quot;list&quot;&gt;목록 보기&lt;/a&gt;
                        &amp;nbsp;&amp;nbsp;&lt;a href=&quot;delete?bId=${content_view.bId}&quot;&gt;삭제&lt;/a&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>list.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!-- MODEL에서 참조값으로 결과값을 꺼내면 됨 --&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;번호&lt;/td&gt;
            &lt;td&gt;이름&lt;/td&gt;
            &lt;td&gt;제목&lt;/td&gt;
            &lt;td&gt;날짜&lt;/td&gt;
            &lt;td&gt;히트&lt;/td&gt;
        &lt;/tr&gt;

        &lt;c:forEach items=&quot;${list}&quot; var=&quot;dto&quot;&gt;&lt;!--Model의 list로 가지고옴--&gt;
            &lt;tr&gt;&lt;!-- 결과 출력 --&gt;
                &lt;td&gt;${dto.bId}&lt;/td&gt;
                &lt;td&gt;${dto.bName}&lt;/td&gt;
                &lt;td&gt;&lt;!-- 글번호를 넘겨줘야함으로 쿼리스트링 사용, 글번호는 ${dto.bId}으로 표현 --&gt;
                    &lt;a href=&quot;content_view?bId=${dto.bId}&quot;&gt;${dto.bTitle}&lt;/a&gt;
                &lt;/td&gt;
                &lt;td&gt;${dto.bDate}&lt;/td&gt;
                &lt;td&gt;${dto.bHit}&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;

        &lt;tr&gt;
            &lt;td colspan=&quot;5&quot;&gt;
                &lt;a href=&quot;write_view&quot;&gt;글작성&lt;/a&gt;&lt;!-- BController의 write_view로 이동  --&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>write_view.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;write&quot;&gt;&lt;!-- BController에서 write로 호출 해야함 --&gt;
            &lt;tr&gt;
                &lt;td&gt;이름&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bName&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;제목&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bTitle&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;내용&lt;/td&gt;
                &lt;td&gt;
                    &lt;textarea rows=&quot;10&quot; name=&quot;bContent&quot;&gt;&lt;/textarea&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;입력&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h3 id="예제-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/1c8053e5-dc5c-4de5-9c2d-daae1f1294f1/image.png" alt=""></p>
<pre><code class="language-sql">CREATE TABLE item
(name VARCHAR2(20)
,price NUMBER(8)
,description VARCHAR2(100)
);</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c71e545e-871b-49db-a3ed-d18f6e0c378b/image.png" alt=""></p>
<p><strong>com.javalec.spring_test_item.controller</strong></p>
<p>ItemController.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item.controller;

import javax.servlet.http.HttpServletRequest;

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

import com.javalec.spring_test_item.service.ItemContentService;
import com.javalec.spring_test_item.service.ItemService;
import com.javalec.spring_test_item.service.ItemWriteService;

@Controller
public class ItemController {
    ItemService service;

    @RequestMapping(&quot;/write&quot;)
    public String write() {
        System.out.println(&quot;@@@### write()&quot;);

        return &quot;itemWrite&quot;;
    }

    @RequestMapping(&quot;/writeResult&quot;)
    public String writeResult(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### writeResult()&quot;);

        model.addAttribute(&quot;request&quot;, request);
        service = new ItemWriteService();
        service.execute(model);

        return &quot;writeResult&quot;;
    }

    @RequestMapping(&quot;/content_view&quot;)
    public String content_view(Model model) {
        System.out.println(&quot;@@@### content_view()&quot;);

        service = new ItemContentService();
        service.execute(model);

        return &quot;content_view&quot;;
    }

}</code></pre>
<p><strong>com.javalec.spring_test_item.dao</strong></p>
<p>ItemDao.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.javalec.spring_test_item.dto.ItemDto;

public class ItemDao {
    DataSource dataSource;

    public ItemDao() {
        try {
            Context context = new InitialContext();
            dataSource = (DataSource) context.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void write(String name, int price, String description) {
        Connection conn=null;
        PreparedStatement pstmt=null;

        try {
            conn = dataSource.getConnection();
            String sql=&quot;insert into item(name, price, description) values(?,?,?)&quot;;
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            pstmt.setInt(2, price);
            pstmt.setString(3, description);
            pstmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    public ArrayList&lt;ItemDto&gt; contentView(){
        ArrayList&lt;ItemDto&gt; dtos=new ArrayList&lt;ItemDto&gt;();
        Connection conn=null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;

        try {
            conn = dataSource.getConnection();
            String sql=&quot;select name, price, description from item&quot;;
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                String name = rs.getString(&quot;name&quot;);
                int price = rs.getInt(&quot;price&quot;);
                String description = rs.getString(&quot;description&quot;);

                ItemDto dto = new ItemDto(name, price, description);
                dtos.add(dto);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(rs != null) rs.close();
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

        return dtos;
    }
}</code></pre>
<p><strong>com.javalec.spring_test_item.dto</strong></p>
<p>ItemDto.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item.dto;

public class ItemDto {
    String name;
    int price;
    String description;

    public ItemDto() {
        // TODO Auto-generated constructor stub
    }

    public ItemDto(String name, int price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

}</code></pre>
<p><strong>com.javalec.spring_test_item.service</strong></p>
<p>ItemService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item.service;

import org.springframework.ui.Model;

public interface ItemService {
    public void execute(Model model);
}</code></pre>
<p>ItemContentService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item.service;

import java.util.ArrayList;

import org.springframework.ui.Model;

import com.javalec.spring_test_item.dao.ItemDao;
import com.javalec.spring_test_item.dto.ItemDto;

public class ItemContentService implements ItemService{

    @Override
    public void execute(Model model) {
        ItemDao dao = new ItemDao();
        ArrayList&lt;ItemDto&gt; dtos = dao.contentView();
        model.addAttribute(&quot;content_view&quot;, dtos);
    }

}</code></pre>
<p>ItemWriteService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_item.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_test_item.dao.ItemDao;

public class ItemWriteService implements ItemService{

    @Override
    public void execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);

        String name = request.getParameter(&quot;name&quot;);
        int price = Integer.parseInt(request.getParameter(&quot;price&quot;));
        String description = request.getParameter(&quot;description&quot;);

        ItemDao dao = new ItemDao();
        dao.write(name, price, description);
    }

}</code></pre>
<p>content_view.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;상품명&lt;/td&gt;
            &lt;td&gt;가격&lt;/td&gt;
            &lt;td&gt;설명&lt;/td&gt;
        &lt;/tr&gt;
        &lt;c:forEach items=&quot;${content_view}&quot; var=&quot;dto&quot;&gt;
            &lt;tr&gt;
                &lt;td&gt;${dto.name}&lt;/td&gt;
                &lt;td&gt;${dto.price}&lt;/td&gt;
                &lt;td&gt;${dto.description}&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>itemWrite.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form method=&quot;post&quot; action=&quot;writeResult&quot;&gt;
        &lt;table&gt;
            &lt;tr&gt;
                &lt;td&gt;상품명&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;가격&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;price&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;설명&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;description&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;전송&quot;&gt;
                    &lt;input type=&quot;reset&quot; value=&quot;취소&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>writeResult.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;a href=&quot;content_view&quot;&gt;결과 보기&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="예제-2">예제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7a73d4e1-d777-43ea-a38c-2ed5521e7843/image.png" alt=""></p>
<pre><code class="language-sql">OMMIT;
CREATE TABLE MVC_MEMBER
(MEM_UID VARCHAR2(15)
,MEM_PWD VARCHAR2(15)
,MEM_NAME VARCHAR2(10)
);

SELECT MEM_UID, MEM_PWD, MEM_NAME FROM MVC_MEMBER;
insert into MVC_MEMBER(MEM_UID, MEM_PWD, MEM_NAME) values(&#39;aaa&#39;,&#39;1234&#39;,&#39;abc&#39;);</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c44abd04-8410-4f53-aeaa-d7dc68cbe645/image.png" alt="">
<strong>com.javalec.spring_test_member.controller</strong></p>
<p>MemController.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member.controller;

import javax.servlet.http.HttpServletRequest;

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

import com.javalec.spring_test_member.service.MemLoginService;
import com.javalec.spring_test_member.service.MemService;

@Controller
public class MemController {
    MemService service;

    @RequestMapping(&quot;/login&quot;)
    public String login() {
        System.out.println(&quot;###@@@ login()&quot;);

        return &quot;login&quot;;
    }

    @RequestMapping(&quot;/login_yn&quot;)
    public String login_yn(HttpServletRequest request, Model model) {
        System.out.println(&quot;###@@@ login_yn()&quot;);

        model.addAttribute(&quot;request&quot;,request);
        service =  new MemLoginService();
        int result = service.execute(model);

        //분기처리
        if (result == 1) {
            return &quot;redirect:login_ok&quot;;//로그인 성공시 이동
        }
        return &quot;redirect:login&quot;;//로그인 실패시 그자리에 그대로 있음
    }

    @RequestMapping(&quot;/login_ok&quot;)
    public String login_ok() {
        System.out.println(&quot;###@@@ login_ok()&quot;);

        return &quot;login_ok&quot;;
    }


}</code></pre>
<p><strong>com.javalec.spring_test_member.dao</strong></p>
<p>MemDao.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemDao {
    DataSource dataSource;

    public MemDao() {
        try {
            Context context = new InitialContext();
            dataSource = (DataSource) context.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public int loginYn(String id, String pw) {
        Connection conn=null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        int re = -1;
        String db_mem_pwd;//DB에서 받는 PW
        try {
            conn = dataSource.getConnection();
//            String sql=&quot;selete mem_pwd from MVC_MEMBER where mem_uid=?&quot;;
            String sql = &quot;SELECT mem_pwd FROM MVC_MEMBER WHERE mem_uid=?&quot;;
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();

            if (rs.next()) {//아이디가 존재한다면
                db_mem_pwd = rs.getString(&quot;mem_pwd&quot;);

                if (db_mem_pwd.equals(pw)) {//패스워드도  일치
                    re = 1;
                }else {//패스워드가 불일치
                    re=0  ;
                }
            }else {//해당 아이디가 존재하지 않음
                re = -1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(rs != null) rs.close();
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

        return re;
    }



}</code></pre>
<p><strong>com.javalec.spring_test_member.dto</strong></p>
<p>MemDto.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member.dto;

public class MemDto {
    String MEM_UID;
    String MEM_PWD;
    String MEM_NAME;
    public String getMEM_UID() {
        return MEM_UID;
    }
    public void setMEM_UID(String mEM_UID) {
        MEM_UID = mEM_UID;
    }
    public String getMEM_PWD() {
        return MEM_PWD;
    }
    public void setMEM_PWD(String mEM_PWD) {
        MEM_PWD = mEM_PWD;
    }
    public String getMEM_NAME() {
        return MEM_NAME;
    }
    public void setMEM_NAME(String mEM_NAME) {
        MEM_NAME = mEM_NAME;
    }

    public MemDto(String mEM_UID, String mEM_PWD, String mEM_NAME) {
        super();
        MEM_UID = mEM_UID;
        MEM_PWD = mEM_PWD;
        MEM_NAME = mEM_NAME;
    }
    public MemDto() {

    }


}</code></pre>
<p><strong>com.javalec.spring_test_member.service</strong></p>
<p>MemService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member.service;

import org.springframework.ui.Model;

public interface MemService {
    public int execute(Model model);
}</code></pre>
<p>MemLoginService.java</p>
<pre><code class="language-java">package com.javalec.spring_test_member.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_test_member.dao.MemDao;

public class MemLoginService implements MemService {

    @Override
    public int execute(Model model) {
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);

        String mId = request.getParameter(&quot;mem_uid&quot;);
        String mPw = request.getParameter(&quot;mem_pwd&quot;);

        MemDao dao = new MemDao();//객체 생성
        int re = dao.loginYn(mId, mPw);

        return re;
    }

}</code></pre>
<p>login_ok,jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;login ok~~!!!&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>login.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table border=&quot;1&quot;  align=&quot;center&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;login_yn&quot; &gt;
            &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;100&quot;&gt;
                     사용자 ID 
                 &lt;/td&gt;
                 &lt;td width=&quot;100&quot;&gt;
                     &lt;input type=&quot;text&quot; name=&quot;mem_uid&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td width=&quot;100&quot;&gt;
                      비밀번호 
                 &lt;/td&gt;
                 &lt;td width=&quot;100&quot;&gt;
                      &lt;input type=&quot;text&quot; name=&quot;mem_pwd&quot; &gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td colspan = &quot;2&quot; align=&quot;center&quot;&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;로그인&quot;&gt;
                      &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
                      &lt;input type=&quot;button&quot; value=&quot;회원가입&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.11 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.11-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.11-Spring</guid>
            <pubDate>Wed, 16 Nov 2022 05:43:11 GMT</pubDate>
            <description><![CDATA[<ul>
<li>저번 시간에서 넘어옴</li>
</ul>
<h3 id="예제-7">예제 7</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b5e33fa5-1467-4494-b1f2-8a8f50bfb8fd/image.png" alt="">
ltaewonclass.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_12_3;

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

@Controller
public class ltaewonclass {
        @RequestMapping(&quot;/actor&quot;) //url 인식하기 위해서 사용
        public String actor(Model model) {
            model.addAttribute(&quot;name&quot;,&quot;박새로이&quot;);

            return &quot;actor/actor&quot;;
        }

        @RequestMapping(&quot;/actress&quot;)
        public String actress(Model model) {
            model.addAttribute(&quot;name&quot;,&quot;조이서&quot;);

            return &quot;actress/actress&quot;;
        }

}</code></pre>
<p>actor.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    남자배우  : ${name}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>actress.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    여자배우  : ${name}&quot;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="예제-8">예제 8</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/24ee2524-f494-43d9-a85b-7e66e816ab3a/image.png" alt=""></p>
<p>HomeController.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_12_4;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;/portpolio/airbnb&quot;) //url 인식하기 위해서 사용
    public String airbnb(Model model) {
        model.addAttribute(&quot;title&quot;,&quot;숙소예약&quot;);

        return &quot;/portpolio/airbnb&quot;;
    }
    @RequestMapping(&quot;/portpolio/universityManager&quot;) //url 인식하기 위해서 사용
    public String universityManager(Model model) {
        model.addAttribute(&quot;title&quot;,&quot;학사관리&quot;);

        return &quot;/portpolio/universityManager&quot;;
    }
    @RequestMapping(&quot;/portpolio/bookManager&quot;) //url 인식하기 위해서 사용
    public String bookManager(Model model) {
        model.addAttribute(&quot;title&quot;,&quot;도서관리&quot;);

        return &quot;/portpolio/bookManager&quot;;
    }

}</code></pre>
<p>airbnb.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    1,2조 : ${title}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>universityManager.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    3조 : ${title}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>bookManager.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    4조 : ${title}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h1 id="char13">Char.13</h1>
<h2 id="httpservletrequest-클래스">HttpServletRequest 클래스</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ac6d2ee8-fd8b-450e-b8d0-b8e1c13b3273/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/08377112-4e01-4a3f-9fc9-33b4cbe82f4a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/10be7286-d322-45a4-ac58-bf087619e085/image.png" alt=""></p>
<h3 id="예제-1">예제 1</h3>
<p>HomeController. java</p>
<pre><code class="language-java">package com.javalec.spring_13_1;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;board/confirmId&quot;)
    public String confirmId(HttpServletRequest httpServletRequest, Model model) {
        String id = httpServletRequest.getParameter(&quot;id&quot;);
        String pw = httpServletRequest.getParameter(&quot;pw&quot;);

        model.addAttribute(&quot;id&quot;,id);
        model.addAttribute(&quot;pw&quot;,pw);

        return &quot;board/confirmId&quot;;
    }

}</code></pre>
<p>confirmId.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    ID : ${id}&lt;br&gt;
    PW : ${pw}&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8301e9d1-ec3d-4871-baeb-01276e87afe4/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/191be71b-8681-46bf-be6c-6f7de469747f/image.png" alt=""></p>
<h2 id="requestparam-어노테이션">@RequestParam 어노테이션</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7a0b0041-dba8-48be-b1fc-93033248c43a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/48b1dcba-f2bb-47ce-b1c0-6272eee5f5ff/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/1e1e7d30-4a56-4a79-9e6d-a6cb05231637/image.png" alt=""></p>
<h3 id="예제-2">예제 2</h3>
<p>파라미터가 없으면 오류 페이지 출력(위의 예제에서는 값이 아예 안나왔지만 여기는 페이지부터 걍 안뜸)</p>
<p>HomeController.java</p>
<pre><code class="language-java">package com.javalec.spring_13_2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;board/checkId&quot;)
    public String checkId(@RequestParam(&quot;id&quot;) String id, @RequestParam(&quot;pw&quot;) int pw, Model model) {
        model.addAttribute(&quot;identify&quot;, id);
        model.addAttribute(&quot;password&quot;, pw);

        return &quot;board/checkId&quot;;
    }

}</code></pre>
<p>checkId.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    ID : ${identify}&lt;br&gt;
    PW : ${password}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/44ce5535-d07a-4d8b-835e-c2a869bb856f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/411f5e25-6584-41ad-bb90-0fc2e4c8c020/image.png" alt=""></p>
<h2 id="데이터커맨드-객체">데이터(커맨드) 객체</h2>
<ul>
<li><p>예제 보면 확인 가능(spring_13_3)</p>
</li>
<li><p>기존 방법의 경우 : 다소 코드 양이 많음.
<img src="https://velog.velcdn.com/images/sofia_777/post/ac29a659-3ff0-4055-99cd-f106d0ad57e9/image.png" alt=""></p>
</li>
<li><p>개선한 방법의 경우 : 코드 양이 적음</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/557b68bf-d717-45f0-a00d-b6713f5b78ca/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/d0eb930b-3323-46b1-9708-d10753197d21/image.png" alt=""></p>
<h3 id="예제-3">예제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/26706cc5-90a1-486a-92af-54187017b058/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/a4bffa8e-43d7-4332-bee7-21912b22f7b9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/5163698f-a752-4730-a898-39016630226b/image.png" alt=""></p>
<p>HomeController.java</p>
<pre><code class="language-java">package com.javalec.spring_13_3;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

//    @RequestMapping(&quot;member/join&quot;)
//    public String joinData(@RequestParam(&quot;name&quot;) String name
//                                ,@RequestParam(&quot;id&quot;) String id
//                                ,@RequestParam(&quot;pw&quot;) String pw
//                                ,@RequestParam(&quot;email&quot;) String email
//                                ,Model model
//                                ) {
//        Member member = new Member();
//        member.setName(name);
//        member.setId(id);
//        member.setPw(pw);
//        member.setEmail(email);
//        
//        model.addAttribute(&quot;member&quot;,member);
//        
//        return &quot;member/join&quot;;
//        
//    }
    //위의 방법도 가능하지만 밑의 방법으로 하면 간단하게 할 수있음
    @RequestMapping(&quot;member/join&quot;)
    public String joinData(Member member) {

        return &quot;member/join&quot;;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/a372cf0c-0037-4450-a6d0-f332f3c89e22/image.png" alt=""></p>
<h2 id="pathvariable">@PathVariable</h2>
<ul>
<li>예제로 확인 가능 (spring_13_4)
<img src="https://velog.velcdn.com/images/sofia_777/post/b33360cb-641a-46fa-b810-f7c04eabd433/image.png" alt=""></li>
</ul>
<h3 id="예제-4">예제 4</h3>
<p>HomeController .java</p>
<pre><code class="language-java">package com.javalec.spring_13_4;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;student/{studentId777}&quot;)
    public String getStudent(@PathVariable String studentId777, Model model) {
        model.addAttribute(&quot;studentId&quot;, studentId777);

        return &quot;student/studentView&quot;;
    }
}</code></pre>
<p>student.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    student : ${studentId}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8f3dd5bf-87bf-49ea-b409-a8b711739b18/image.png" alt=""></p>
<hr>
<h1 id="char14requestmapping-파라미터">Char14.@RequestMapping 파라미터</h1>
<h2 id="requestmapping에서-get방식과-post방식">RequestMapping에서 Get방식과 Post방식</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/19f393eb-1b16-4442-95da-5a69c22c255e/image.png" alt=""></p>
<h3 id="예제-5">예제 5</h3>
<p>HomeController .java</p>
<pre><code class="language-java">package com.javalec.spring_14_1_2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.servlet.ModelAndView;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;/index&quot;)
    public String goIndex() {

        return &quot;index&quot;;
    }


    @RequestMapping(method = RequestMethod.GET, value = &quot;/student&quot;)//전송방식get으로 지정
    public String goStudent(HttpServletRequest httpServletRequest, Model model) {
        System.out.println(&quot;@@@### RequestMethod.GET&quot;);

        String id = httpServletRequest.getParameter(&quot;id&quot;);
        model.addAttribute(&quot;studentId&quot;,id);

        return &quot;student/studentId&quot;;
    }


    @RequestMapping(method = RequestMethod.POST, value = &quot;/student&quot;)//전송방식 post으로 지정
    public ModelAndView goStudent(HttpServletRequest httpServletRequest) {
        System.out.println(&quot;@@@### RequestMethod.POST&quot;);

        String id = httpServletRequest.getParameter(&quot;id&quot;);
        ModelAndView mv = new ModelAndView();
        mv.addObject(&quot;studentId&quot;,id);
        mv.setViewName(&quot;student/studentId&quot;);

//        return &quot;student/studentId&quot;;
        return mv;
    }

}</code></pre>
<p>student.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!--  &lt;form method=&quot;post&quot; action=&quot;student.jsp&quot;&gt;--&gt;


     &lt;form method=&quot;post&quot; action=&quot;student&quot;&gt;
    &lt;!--&lt;form method=&quot;get&quot; action=&quot;student&quot;&gt;--&gt;
        student id : &lt;input type=&quot;text&quot; name=&quot;id&quot;&gt;&lt;br&gt;
        &lt;input type=&quot;submit&quot; value=&quot;전송&quot;&gt; 
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/a52143c1-8aec-40b5-8bb4-6793d68276c5/image.png" alt=""></p>
<p>index,jsp의 form method가 Get 인 경우 출력 됨
<img src="https://velog.velcdn.com/images/sofia_777/post/3ae127bd-b14a-4027-af8d-1e238bcfdc6d/image.png" alt=""></p>
<p>index,jsp의 form method가 post 인 경우 출력 됨
<img src="https://velog.velcdn.com/images/sofia_777/post/c461c5bf-aca7-4f31-beff-739e1c257a12/image.png" alt=""></p>
<h2 id="modelattribute">ModelAttribute</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/bb690dd9-7dd4-408e-b907-4312eb51ea7c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/78370ee3-8eb1-4cf6-8a0f-bfe04a0697ed/image.png" alt=""></p>
<h3 id="예제-6">예제 6</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/29d09ef3-b15e-4a60-8068-ed07d366b241/image.png" alt=""></p>
<p>HomeController.java</p>
<pre><code class="language-java">package com.javalec.spring_14_2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;/index&quot;)
    public String index() {

        return &quot;index&quot;;
    }

    @RequestMapping(&quot;/studentView&quot;)
    public String studentView(StudentInfomation studentInfomation) {

        return &quot;studentView&quot;;
    }


}</code></pre>
<p>또는</p>
<pre><code class="language-java">package com.javalec.spring_14_2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;/index&quot;)
    public String index() {

        return &quot;index&quot;;
    }

    @RequestMapping(&quot;/studentView&quot;)
//    public String studentView(StudentInfomation studentInfomation) {
        public String studentView(StudentInfomation studentInfo) {

        return &quot;studentView&quot;;
    }


}</code></pre>
<p>index.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form method=&quot;get&quot; action=&quot;studentView&quot;&gt;
        이름 :&lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;&lt;br&gt;
        나이 :&lt;input type=&quot;text&quot; name=&quot;age&quot;&gt;&lt;br&gt;
        학년 :&lt;input type=&quot;text&quot; name=&quot;gradeNum&quot;&gt;&lt;br&gt;
        반 :&lt;input type=&quot;text&quot; name=&quot;classNum&quot;&gt;&lt;br&gt;
        &lt;input type=&quot;submit&quot; name=&quot;전송&quot;&gt;&lt;br&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>StudentInfomation.java</p>
<pre><code class="language-java">package com.javalec.spring_14_2;

public class StudentInfomation {
    private String name;
    private String age;
    private String gradeNum;
    private String classNum;


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getGradeNum() {
        return gradeNum;
    }
    public void setGradeNum(String gradeNum) {
        this.gradeNum = gradeNum;
    }
    public String getClassNum() {
        return classNum;
    }
    public void setClassNum(String classNum) {
        this.classNum = classNum;
    }


}</code></pre>
<p>studentView.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    studentView.jsp입니다.
    이름 : ${studentInfomation.name}
    나이 : ${studentInfomation.age}
    학년 : ${studentInfomation.gradeNum}
    반 : ${studentInfomation.classNum}

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/136341f2-0a56-4e27-b6aa-d35a9d585d33/image.png" alt=""></p>
<p>만약에</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!--이름 : ${studentInfomation.name}&lt;br&gt;
    나이 : ${studentInfomation.age}&lt;br&gt;
    학년 : ${studentInfomation.gradeNum}&lt;br&gt;
    반 : ${studentInfomation.classNum}&lt;br&gt;  --&gt;

    이름 : ${studentInfo.name}&lt;br&gt;
    나이 : ${studentInfo.age}&lt;br&gt;
    학년 : ${studentInfo.gradeNum}&lt;br&gt;
    반 : ${studentInfo.classNum}&lt;br&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>으로 수정시 값이 출력되지 않음
<img src="https://velog.velcdn.com/images/sofia_777/post/2f3271e7-95a0-429c-827c-1d3e49c24405/image.png" alt="">
HomeController.java의 이름을 바꿔서 하고싶으면 @ModelAttribute를 사용</p>
<h3 id="예제-7-1">예제 7</h3>
<p>HomeController .java</p>
<pre><code class="language-java">package com.javalec.spring_14_2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;/index&quot;)
    public String index() {

        return &quot;index&quot;;
    }

    @RequestMapping(&quot;/studentView&quot;)
//    public String studentView(StudentInfomation studentInfomation) {

//    public String studentView(StudentInfomation studentInfo) {
//    참조변수를 바꿔도 StudentInfomation를 따라간다.

    public String studentView(@ModelAttribute(&quot;studentInfo&quot;) StudentInfomation studentInfo) {
        return &quot;studentView&quot;;
    }


}</code></pre>
<p>studentView.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!--이름 : ${studentInfomation.name}&lt;br&gt;
    나이 : ${studentInfomation.age}&lt;br&gt;
    학년 : ${studentInfomation.gradeNum}&lt;br&gt;
    반 : ${studentInfomation.classNum}&lt;br&gt;  --&gt;

    이름 : ${studentInfo.name}&lt;br&gt;
    나이 : ${studentInfo.age}&lt;br&gt;
    학년 : ${studentInfo.gradeNum}&lt;br&gt;
    반 : ${studentInfo.classNum}&lt;br&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/79674a55-4f93-4004-a8fc-ebace0430384/image.png" alt=""></p>
<h2 id="redirect--키워드">Redirect : 키워드</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/f0153f21-af70-42c8-a963-8e2bc003e95d/image.png" alt=""></p>
<h3 id="예제-8-1">예제 8</h3>
<p>RedirectController.java</p>
<pre><code class="language-java">package com.javalec.spring_14_3;

import javax.servlet.http.HttpServletRequest;

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

@Controller
public class RedirectController {
    @RequestMapping(&quot;/studentConfirm&quot;)
    public String studentRedirect(HttpServletRequest httpServletRequest) {
        String id = httpServletRequest.getParameter(&quot;id&quot;);

        if (id.equals(&quot;abc&quot;)) {
            return &quot;redirect:studentOk&quot;;
        }

        return &quot;redirect:studentNg&quot;;
    }

    @RequestMapping(&quot;/studentOk&quot;)
    public String studentOk() {
            return &quot;student/studentOk&quot;;
    }

    @RequestMapping(&quot;/studentNg&quot;)
    public String studentNg() {
        return &quot;student/studentNg&quot;;
    }
}</code></pre>
<p>studentOk.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    studentOk.jsp 입니다.
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>studentNg.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    studentNg.jsp 입니다.
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ab2aa0f1-1d81-4602-8538-6edd31bd8019/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/445b1010-6a0d-4344-946d-0ff26312ed03/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/77d7e954-0c5c-40cf-845d-47da16b98eea/image.png" alt=""></p>
<hr>
<h1 id="char15-스프링mvc-게시판">Char15. 스프링MVC 게시판</h1>
<h3 id="예제-9">예제 9</h3>
<ol>
<li>SQL<pre><code class="language-java">SELECT * FROM MVC_BOARD;
</code></pre>
</li>
</ol>
<p>DELETE from MVC_BOARD;</p>
<p>SELECT * FROM MVC_BOARD_SEQ;
SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD;
INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bDate, bHit)
VALUES (1,&#39;aaa&#39;,&#39;a1&#39;,&#39;abcd&#39;,sysdate,0);
COMMIT;</p>
<p>-- 글번호를 SEQUENCE로 처리
INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bDate, bHit) 
VALUES(MVC_BOARD_SEQ.NEXTVAL,?,?,?,sysdate,0);</p>
<p>DROP TABLE MVC_BOARD;
DROP SEQUENCE MVC_BOARD_SEQ;</p>
<p>--테이블 생성
CREATE TABLE MVC_BOARD
(bId NUMBER(4) PRIMARY KEY--글번호
,bName VARCHAR2(20) -- 작성자
,bTitle  VARCHAR2(100) -- 글제목
,bContent  VARCHAR2(300) -- 글 내용
,bDate Date DEFAULT SYSDATE -- 작성일
,bHit NUMBER(4) DEFAULT 0 -- 조회수
);</p>
<p>-- 시퀀스 생성 
-- 1부터 증가하여 반복 없이 1씩 증가
CREATE SEQUENCE MVC_BOARD_SEQ
MINVALUE 1
MAXVALUE 9999
INCREMENT BY 1 START WITH 1 NOCYCLE;</p>
<pre><code>
```java

--테이블 생성
CREATE TABLE MVC_BOARD
(bId NUMBER(4) PRIMARY KEY--글번호
,bName VARCHAR2(20) -- 작성자
,bTitle  VARCHAR2(100) -- 글제목
,bContent  VARCHAR2(300) -- 글 내용
,bDate Date DEFAULT SYSDATE -- 작성일
,bHit NUMBER(4) DEFAULT 0 -- 조회수
);

-- 시퀀스 생성 
-- 1부터 증가하여 반복 없이 1씩 증가
CREATE SEQUENCE MVC_BOARD_SEQ
MINVALUE 1
MAXVALUE 9999
INCREMENT BY 1 START WITH 1 NOCYCLE;

INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bDate, bHit) 
VALUES(MVC_BOARD_SEQ.NEXTVAL,?,?,?,sysdate,0);

COMMIT;</code></pre><p><img src="https://velog.velcdn.com/images/sofia_777/post/9f56fc7f-84bb-4414-b2bd-69a8343b9335/image.png" alt=""></p>
<pre><code class="language-java">&lt;Resource auth=&quot;Container&quot; driverClassName=&quot;oracle.jdbc.driver.OracleDriver&quot;
 maxActive=&quot;100&quot; maxIdle=&quot;30&quot; maxWait=&quot;10000&quot; name=&quot;jdbc/oracle&quot; 
password=&quot;-----&quot; type=&quot;javax.sql.DataSource&quot; 
url=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot; username=&quot;-----&quot;/&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b50adb75-71f8-4b8f-9a79-e1bd16622c0e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/36debb32-88c2-4543-889f-4c99ae54238b/image.png" alt=""></p>
<p>BController.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.controller;

import javax.servlet.http.HttpServletRequest;

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

import com.javalec.spring_mvc_board.command.BCommand;
import com.javalec.spring_mvc_board.command.BListCommand;
import com.javalec.spring_mvc_board.command.BWriteCommand;

@Controller //어노테이션 -&gt; 컨트롤러  생성
public class BController {
    BCommand command;//인터페이스? 생성?

    //목록 조회
    @RequestMapping(&quot;/list&quot;)//url 받음
    public String list(Model model) {
        System.out.println(&quot;@@@### list()&quot;);

        //command 단 호출(패키지 command 쪽 호출)

        command = new BListCommand();
        //command로(인터페이스) 수정 삭제 삽입등을 받으면 됨. 왜냐 인터페이스로 상속 받을 예정이기 때문
        command.execute(model);//호출

        return &quot;list&quot;;//결과값 받아서 화면 출력해야하기 때문에 list생성해야함

    }


    @RequestMapping(&quot;/write_view&quot;)//url 받음
    public String write_view() {
        System.out.println(&quot;@@@### write_view()&quot;);

        return &quot;write_view&quot;;//글쓰기 폼으로 이동

    }


    @RequestMapping(&quot;/write&quot;)//url 받음
    public String write(HttpServletRequest request, Model model) {
        System.out.println(&quot;@@@### write()&quot;);

        //Model에 데이터 삽입
        model.addAttribute(&quot;request&quot;,request);

        command = new BWriteCommand();
        command.execute(model);


        return &quot;redirect:list&quot;;//글 목록 폼으로 이동

    }

}</code></pre>
<p>BCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import org.springframework.ui.Model;

public interface BCommand {//인터페이스

    public void execute(Model model); //선언



}</code></pre>
<p>BListCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import java.util.ArrayList;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board.dao.BDao;
import com.javalec.spring_mvc_board.dto.BDto;

public class BListCommand implements BCommand {

    @Override
    public void execute(Model model) {
        //DAO 단 호출(패키치 DAO쪽 호출)

        BDao dao = new BDao();
        ArrayList&lt;BDto&gt; dtos = dao.list();//list 호출
        //모델 객체에 삽입
        model.addAttribute(&quot;list&quot;,dtos);
    }

}</code></pre>
<p>BWriteCommand.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.command;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.javalec.spring_mvc_board.dao.BDao;

public class BWriteCommand implements BCommand{

    @Override
    //이 메소드는 BController의 public String write(HttpServletRequest request, Model model) 로 보냄
    public void execute(Model model) {
        //Model에서 끌어와서 dao로 끌어보내야함
        Map&lt;String, Object&gt; map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get(&quot;request&quot;);
        //모델에 리퀘스트를 담아서 커맨드로 보내면 됨

        //꺼내서 변수로 담음
        String bName = request.getParameter(&quot;bName&quot;);
        String bTitle = request.getParameter(&quot;bTitle&quot;);
        String bContent = request.getParameter(&quot;bContent&quot;);

        //그후 BDao로 받게 함
        BDao dao = new BDao();
        dao.write(bName, bTitle, bContent);

    }

}</code></pre>
<p>BDao.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.javalec.spring_mvc_board.dto.BDto;

public class BDao {
    DataSource dataSource;

    public BDao() {//기본 생성자 생성

        try {
            Context contex = new InitialContext();
            dataSource = (DataSource) contex.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

        //list.jsp 조회하는 메소드
        public ArrayList&lt;BDto&gt; list(){
            ArrayList&lt;BDto&gt; dtos = new ArrayList&lt;BDto&gt;();

            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;

            try {
                conn = dataSource.getConnection();
                String sql = &quot;SELECT bId, bName, bTitle, bContent, bDate, bHit FROM MVC_BOARD&quot;;
                pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery();


                while (rs.next()) {//결과값받기
                    int bId = rs.getInt(&quot;bId&quot;);
                    String bName = rs.getString(&quot;bName&quot;);
                    String bTitle = rs.getString(&quot;bTitle&quot;);
                    String bContent = rs.getString(&quot;bContent&quot;);
                    Timestamp bDate = rs.getTimestamp(&quot;bDate&quot;);
                    int bHit = rs.getInt(&quot;bHit&quot;);

                    BDto dto = new BDto(bId, bName, bTitle, bContent, bDate, bHit);
                    dtos.add(dto);//arraylist에 추가

                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (rs != null) rs.close();
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
            return dtos;//command쪽의  execute메소드로로 이동
        }

        //글작성 write 메소드?
        public void write(String bName, String bTitle,String bContent) {
            Connection conn = null;
            PreparedStatement pstmt = null;

            try {
                conn = dataSource.getConnection();
                //글 삽입 쿼리문
//                String sql = &quot;INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bDate, bHit) \r\n&quot; + 
//                        &quot; VALUES(MVC_BOARD_SEQ.NEXTVAL,?,?,?,0)&quot;;

                String sql = &quot;INSERT INTO MVC_BOARD(bId, bName, bTitle, bContent, bHit)\r\n&quot; + 
                           &quot; VALUES(MVC_BOARD_SEQ.NEXTVAL,?,?,?,0)&quot;;


                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, bName);
                pstmt.setString(2, bTitle);
                pstmt.setString(3, bContent);
                pstmt.executeUpdate();
                //wirte.jsp에서 삽입되는 데이터들 세팅


            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {//자원 반납
                    if (pstmt != null) pstmt.close();
                    if (conn != null) conn.close();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }

}</code></pre>
<p>BDto.java</p>
<pre><code class="language-java">package com.javalec.spring_mvc_board.dto;

import java.sql.Timestamp;

public class BDto {
    int bId;
    String bName;
    String bTitle;
    String bContent;
    Timestamp bDate;
    int bHit;


    public BDto() {//기본 생성자

    }

    //필드를 사용한 생성자
    public BDto(int bId, String bName, String bTitle, String bContent, Timestamp bDate, int bHit) {
        super();
        this.bId = bId;
        this.bName = bName;
        this.bTitle = bTitle;
        this.bContent = bContent;
        this.bDate = bDate;
        this.bHit = bHit;
    }

    public int getbId() {
        return bId;
    }
    public void setbId(int bId) {
        this.bId = bId;
    }
    public String getbName() {
        return bName;
    }
    public void setbName(String bName) {
        this.bName = bName;
    }
    public String getbTitle() {
        return bTitle;
    }
    public void setbTitle(String bTitle) {
        this.bTitle = bTitle;
    }
    public String getbContent() {
        return bContent;
    }
    public void setbContent(String bContent) {
        this.bContent = bContent;
    }
    public Timestamp getbDate() {
        return bDate;
    }
    public void setbDate(Timestamp bDate) {
        this.bDate = bDate;
    }
    public int getbHit() {
        return bHit;
    }
    public void setbHit(int bHit) {
        this.bHit = bHit;
    }


}</code></pre>
<p>list.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!-- MODEL에서 참조값으로 결과값을 꺼내면 됨 --&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;번호&lt;/td&gt;
            &lt;td&gt;이름&lt;/td&gt;
            &lt;td&gt;제목&lt;/td&gt;
            &lt;td&gt;날짜&lt;/td&gt;
            &lt;td&gt;하트&lt;/td&gt;
        &lt;/tr&gt;

        &lt;c:forEach items=&quot;${list}&quot; var=&quot;dto&quot;&gt;&lt;!--Model의 list로 가지고옴--&gt;
            &lt;tr&gt;&lt;!-- 결과 출력 --&gt;
                &lt;td&gt;${dto.bId}&lt;/td&gt;
                &lt;td&gt;${dto.bName}&lt;/td&gt;
                &lt;td&gt;${dto.bTitle}&lt;/td&gt;
                &lt;td&gt;${dto.bDate}&lt;/td&gt;
                &lt;td&gt;${dto.bHit}&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;

        &lt;tr&gt;
            &lt;td colspan=&quot;5&quot;&gt;
                &lt;a href=&quot;write_view&quot;&gt;글작성&lt;/a&gt;&lt;!-- BController의 write_view로 이동  --&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>write_view.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;500&quot; border=&quot;1&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;write&quot;&gt;&lt;!-- BController에서 write로 호출 해야함 --&gt;
            &lt;tr&gt;
                &lt;td&gt;이름&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bName&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;제목&lt;/td&gt;
                &lt;td&gt;
                    &lt;input type=&quot;text&quot; name=&quot;bTitle&quot; size=&quot;50&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;내용&lt;/td&gt;
                &lt;td&gt;
                    &lt;textarea rows=&quot;10&quot; name=&quot;bContent&quot;&gt;&lt;/textarea&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;입력&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.07 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.07-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.07-Spring</guid>
            <pubDate>Wed, 16 Nov 2022 05:42:57 GMT</pubDate>
            <description><![CDATA[<h1 id="char-9-aopaspect-oriented-programming-i">Char 9. AOP(Aspect Oriented Programming)-I</h1>
<h2 id="aop란">AOP란</h2>
<p><strong>관점 지향 프로그래밍</strong>
(관점지향 : 어떤 로직을 기준으로, 핵심적인 관점/부가적인 관점으로 나눠보고, 그 관점을 기준으로 각각 모듈화(어떤 공통된 로직이나 기능을 하나단위로 묶는것)하겠다는 것</p>
<p><strong>AOP 의존 설정</strong>
(오류발생시 pom.xml작성)</p>
<pre><code class="language-java">&lt;!-- cglib --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.kenai.nbpwr&lt;/groupId&gt;
    &lt;artifactId&gt;net-sf-cglib&lt;/artifactId&gt;
    &lt;version&gt;2.1.3-201003011305&lt;/version&gt;
&lt;/dependency&gt;
&lt;!-- AOP --&gt;
&lt;dependency&gt;
            &lt;groupId&gt;org.aspectj&lt;/groupId&gt;
            &lt;artifactId&gt;aspectjweaver&lt;/artifactId&gt;
            &lt;version&gt;1.7.4&lt;/version&gt;
        &lt;/dependency&gt;
</code></pre>
<p><strong>주요 개념</strong></p>
<ol>
<li>Aspect
: 여러객체에 공통으로 적용되는 기능</li>
</ol>
<p>2.Advice
:  언제 공통 관심 기능을 핵심로직에 적용할 지 정의.</p>
<p>3.Jointpoint
: Adivce를 적용 가능한 지점(메소드 호출, 필드값 변경 등이 해당)
스프링은 프록시를 이용하여 AOP를 구현하기 때문에 메소드 호출에 대한 JoinPoint만 지원됨.</p>
<p>4.Pointcut
:Join Point의 상세한 스펙을 정의한 것. </p>
<p>5.Weaving (핵심기능을 적용시키는 행위 자체)
:Advice를 핵심 로직 코드에 적용하는 것</p>
<h2 id="xml-기반의-aop-구현">xml 기반의 AOP 구현</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/3d16ff5f-9bd8-44e9-a043-f13997328143/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/d5d07e66-20cc-41c9-8359-12960d6f5878/image.png" alt=""></p>
<p>공통 기능을 쓰기 위해 Bean 생성</p>
<p>Expression -&gt; com.javalec.ex… -&gt; 패키지안의 적용 범위</p>
<h3 id="adivce-종류">Adivce 종류</h3>
<p><a href="aop:before">aop:before</a> : 메소드 실행 전에 advice실행
<a href="aop:after-returning">aop:after-returning</a> : 정상적으로 메소드 실행 후에 advice실행
<a href="aop:after-throwing">aop:after-throwing</a> : 메소드 실행중 exception 발생시 advice실행
<a href="aop:after">aop:after</a> : 메소드 실행중 exception 이 발생하여도 advice실행
<a href="aop:around">aop:around</a> : 메서드 실행 전/후 및 exception 발생시 advice실행</p>
<h3 id="예제-1">예제 1</h3>
<p>Student</p>
<pre><code class="language-java">package com.javalec.spring_9_1;

public class Student {
    private String name;
    private int age;
    private int gradeNum;
    private int classNumS;


    public void getStudentInfo() {
        System.out.println(&quot;이름 : &quot;+getName());
        System.out.println(&quot;나이 : &quot;+getAge());
        System.out.println(&quot;학년 : &quot;+getGradeNum());
        System.out.println(&quot;반 : &quot;+getClassNumS());
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getGradeNum() {
        return gradeNum;
    }
    public void setGradeNum(int gradeNum) {
        this.gradeNum = gradeNum;
    }
    public int getClassNumS() {
        return classNumS;
    }
    public void setClassNumS(int classNumS) {
        this.classNumS = classNumS;
    }
}</code></pre>
<p>Worker</p>
<pre><code class="language-java">package com.javalec.spring_9_1;

public class Worker {
    private String name;
    private int age;
    private String job;

    public void getWorkerInfo() {
        System.out.println(&quot;이름 : &quot;+getName());
        System.out.println(&quot;나이  : &quot;+getAge());
        System.out.println(&quot;직업 : &quot;+getJob());
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
}</code></pre>
<p>LogAop</p>
<pre><code class="language-java">package com.javalec.spring_9_1;

import org.aspectj.lang.ProceedingJoinPoint;

public class LogAop {
    public Object loggerAop(ProceedingJoinPoint jointPoint) {
        String signatureStr = jointPoint.getSignature().toShortString();
        System.out.println(signatureStr+&quot;is start&quot;);
        long st = System.currentTimeMillis();
        Object obj = null;

        //핵심기능..적용된 기능
        try {
            obj =jointPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }finally {
            long et = System.currentTimeMillis();
            System.out.println(signatureStr+&quot;is end&quot;);
            System.out.println(signatureStr+&quot;경과시간 : &quot;+(et-st));
        }
        return obj;
    }
}</code></pre>
<p>또는</p>
<pre><code class="language-java">package com.javalec.spring_9_1;

import org.aspectj.lang.ProceedingJoinPoint;

public class LogAop {
    public Object loggerAop(ProceedingJoinPoint jointPoint) throws Throwable {
        String signatureStr = jointPoint.getSignature().toShortString();
        System.out.println(signatureStr+&quot;is start&quot;);
        long st = System.currentTimeMillis();
        Object obj = null;

//        //핵심기능..적용된 기능
        try {
            obj =jointPoint.proceed();
            return obj;
        }finally {
            long et = System.currentTimeMillis();
            System.out.println(signatureStr+&quot;is end&quot;);
            System.out.println(signatureStr+&quot;경과시간 : &quot;+(et-st));
        }

    }
}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd&quot;&gt;

    &lt;bean id=&quot;logAop&quot; class=&quot;com.javalec.spring_9_1.LogAop&quot;&gt;&lt;/bean&gt;

    &lt;aop:config&gt;
        &lt;aop:aspect id=&quot;logger&quot; ref=&quot;logAop&quot;&gt;
            &lt;aop:pointcut id=&quot;publicM&quot; expression=&quot;within(com.javalec.spring_9_1.*)&quot;/&gt;
            &lt;aop:around method=&quot;loggerAop&quot; pointcut-ref=&quot;publicM&quot;/&gt;
        &lt;/aop:aspect&gt;
    &lt;/aop:config&gt;


    &lt;!--bean 객체 생성  --&gt;
    &lt;bean id=&quot;student&quot; class=&quot;com.javalec.spring_9_1.Student&quot;&gt;
        &lt;property name=&quot;name&quot; value=&quot;홍길동&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;age&quot; value=&quot;10&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;gradeNum&quot; value=&quot;3&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;classNumS&quot; value=&quot;5&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;worker&quot; class=&quot;com.javalec.spring_9_1.Worker&quot;&gt;
        &lt;property name=&quot;name&quot; value=&quot;홍길순&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;age&quot; value=&quot;35&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;job&quot; value=&quot;개발자&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<p>MainClass</p>
<pre><code class="language-java">package com.javalec.spring_9_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);

        Student student = ctx.getBean(&quot;student&quot;,Student.class);
        student.getStudentInfo();


        Worker worker = ctx.getBean(&quot;worker&quot;,Worker.class);
        worker.getWorkerInfo();
    }
}</code></pre>
<p>pom.xml</p>
<pre><code class="language-java">&lt;!-- AOP --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.aspectj&lt;/groupId&gt;
            &lt;artifactId&gt;aspectjweaver&lt;/artifactId&gt;
            &lt;version&gt;1.7.4&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;!-- cglib --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.kenai.nbpwr&lt;/groupId&gt;
            &lt;artifactId&gt;net-sf-cglib&lt;/artifactId&gt;
            &lt;version&gt;2.1.3-201003011305&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/f0250a38-a941-4a53-be41-e81cc2d92086/image.png" alt=""></p>
<h3 id="연습문제-1">연습문제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/dd4c4f59-5d3b-403c-9242-0d0f66fc44c5/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/24f57966-60cf-4052-96c7-c7b438cdb34a/image.png" alt=""></p>
<p>Professor.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_9_1;

public class Professor {
    private String name;
    private String subject;
    private int age;

    public void getProfessorInfo() {
        System.out.println(&quot;이름 : &quot;+getName());
        System.out.println(&quot;과목 : &quot;+getSubject());
        System.out.println(&quot;나이 : &quot;+getAge());
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
}</code></pre>
<p>Singer.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_9_1;

public class Singer {
    private String name;
    private String song;
    private int member;

    public void getSingerInfo() {
        System.out.println(&quot;이름 : &quot;+getName());
        System.out.println(&quot;노래 : &quot;+getSong());
        System.out.println(&quot;멤버 : &quot;+getMember());
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSong() {
        return song;
    }
    public void setSong(String song) {
        this.song = song;
    }
    public int getMember() {
        return member;
    }
    public void setMember(int member) {
        this.member = member;
    }
}</code></pre>
<p>LogAop.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_9_1;

import org.aspectj.lang.ProceedingJoinPoint;

public class LogAop {
    public Object loggerAop(ProceedingJoinPoint jointPoint) {
        String signatureStr = jointPoint.getSignature().toShortString();
        System.out.println(&quot;@@@### start ====&gt;&quot;+signatureStr);
        Object obj = null;


        try {
            obj =jointPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }finally {
            System.out.println(&quot;@@@### end ====&gt;&quot;+signatureStr);
        }



        return signatureStr;
    }
}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd&quot;&gt;

    &lt;bean id=&quot;logAop&quot; class=&quot;com.javalec.spring_ex_9_1.LogAop&quot;&gt; &lt;/bean&gt;

    &lt;aop:config&gt;
        &lt;aop:aspect id=&quot;logger&quot; ref=&quot;logAop&quot;&gt;
            &lt;aop:pointcut id=&quot;publicM&quot; expression=&quot;within(com.javalec.spring_ex_9_1.*)&quot;/&gt;
            &lt;aop:around method=&quot;loggerAop&quot; pointcut-ref=&quot;publicM&quot;/&gt;
        &lt;/aop:aspect&gt;
    &lt;/aop:config&gt;


    &lt;!--bean 객체 생성  --&gt;
    &lt;bean id=&quot;professor&quot; class=&quot;com.javalec.spring_ex_9_1.Professor&quot;&gt;
        &lt;property name=&quot;name&quot; value=&quot;김교수&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;age&quot; value=&quot;33&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;subject&quot; value=&quot;스프링&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;singer&quot; class=&quot;com.javalec.spring_ex_9_1.Singer&quot;&gt;
        &lt;property name=&quot;name&quot; value=&quot;방탄소년단&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;song&quot; value=&quot;다이너마이트&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;member&quot; value=&quot;7&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_9_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);

        Professor professor = ctx.getBean(&quot;professor&quot;,Professor.class);
        professor.getProfessorInfo();


        Singer singer = ctx.getBean(&quot;singer&quot;,Singer.class);
        singer.getSingerInfo();
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/de56d878-751d-4d1f-9354-55c99041ff36/image.png" alt=""></p>
<h1 id="char-10-aopaspect-oriented-programming-ii">Char 10. AOP(Aspect Oriented Programming)-II</h1>
<h2 id="aspect를-이용한-aop구현">@Aspect를 이용한 AOP구현</h2>
<pre><code class="language-java">*.xml
    &lt;aop:config&gt;
        &lt;aop:aspect&gt;
            &lt;aop:pointcut/&gt;
            &lt;aop:around/&gt;
        &lt;/aop:aspect&gt;
    &lt;/aop:config&gt;</code></pre>
<pre><code class="language-java">@Aspect                         (=&lt;aop:config&gt;)
@Pointcut(&quot;within(com.javalec.spring_10_1.*)&quot;)         (=&lt;aop:pointcut/&gt;)
@Around(&quot;pointcutMethod()&quot;)                (=&lt;aop:around/&gt;)</code></pre>
<pre><code class="language-java">*.xml
&lt;aop:aspectj-autoproxy&gt;&lt;/aop:aspectj-autoproxy&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/4da099a7-4fdb-44c2-a080-761f8886bdcf/image.png" alt=""></p>
<h3 id="예제-2">예제 2</h3>
<p>Student.java</p>
<pre><code class="language-java">package com.javalec.spring_10_1;

public class Student {
    private String name;
    private int age;
    private int gradeNum;
    private int classNum;


    public void getStudentInfo() {
        System.out.println(&quot;이름 : &quot;+getName());
        System.out.println(&quot;나이 : &quot;+getAge());
        System.out.println(&quot;학년 : &quot;+getGradeNum());
        System.out.println(&quot;반 : &quot;+getClassNum());
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getGradeNum() {
        return gradeNum;
    }
    public void setGradeNum(int gradeNum) {
        this.gradeNum = gradeNum;
    }
    public int getClassNum() {
        return classNum;
    }
    public void setClassNum(int classNum) {
        this.classNum = classNum;
    }
}</code></pre>
<p>Worker.java</p>
<pre><code class="language-java">package com.javalec.spring_10_1;

public class Worker {
    private String name;
    private int age;
    private String job;

    public void getWorkerInfo() {
        System.out.println(&quot;이름 : &quot;+getName());
        System.out.println(&quot;나이  : &quot;+getAge());
        System.out.println(&quot;직업 : &quot;+getJob());
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
   xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
   xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd&quot;&gt;

   &lt;aop:aspectj-autoproxy&gt;&lt;/aop:aspectj-autoproxy&gt;
   &lt;bean id=&quot;logAop&quot; class=&quot;com.javalec.spring_10_1.LogAop&quot;&gt;&lt;/bean&gt;

   &lt;!-- &lt;aop:config&gt;
      &lt;aop:aspect id=&quot;logger&quot; ref=&quot;logAop&quot;&gt;
         &lt;aop:pointcut expression=&quot;within(com.javalec.spring_10_1.*)&quot; id=&quot;publicM&quot;/&gt;
         &lt;aop:around method=&quot;loggerAop&quot; pointcut-ref=&quot;publicM&quot;/&gt;
      &lt;/aop:aspect&gt;
   &lt;/aop:config&gt; --&gt;

   &lt;bean id=&quot;student&quot; class=&quot;com.javalec.spring_10_1.Student&quot;&gt;
      &lt;property name=&quot;name&quot; value=&quot;홍길동&quot;&gt;&lt;/property&gt;
      &lt;property name=&quot;age&quot; value=&quot;10&quot;&gt;&lt;/property&gt;
      &lt;property name=&quot;gradeNum&quot; value=&quot;3&quot;&gt;&lt;/property&gt;
      &lt;property name=&quot;classNum&quot; value=&quot;5&quot;&gt;&lt;/property&gt;
   &lt;/bean&gt;

   &lt;bean id=&quot;worker&quot; class=&quot;com.javalec.spring_10_1.Worker&quot;&gt;
      &lt;property name=&quot;name&quot; value=&quot;홍길순&quot;&gt;&lt;/property&gt;
      &lt;property name=&quot;age&quot; value=&quot;35&quot;&gt;&lt;/property&gt;
      &lt;property name=&quot;job&quot; value=&quot;개발자&quot;&gt;&lt;/property&gt;
   &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>LogAop.java</p>
<pre><code class="language-java">package com.javalec.spring_10_1;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LogAop {
    @Pointcut(&quot;within(com.javalec.spring_10_1.*)&quot;)//범위 설정
    private void pointCutMethod() {}

    @Around(&quot;pointCutMethod()&quot;)
    public Object loggerAop(ProceedingJoinPoint jointPoint) throws Throwable {
        String signatureStr = jointPoint.getSignature().toShortString();
        System.out.println(signatureStr+&quot;is start&quot;);
        long st = System.currentTimeMillis();
        Object obj = null;

//        //핵심기능 적용된 기능
//        try {
//            obj =jointPoint.proceed();
//        } catch (Throwable e) {
//            e.printStackTrace();
//        }finally {
//            long et = System.currentTimeMillis();
//            System.out.println(signatureStr+&quot;is end&quot;);
//            System.out.println(signatureStr+&quot;경과시간 : &quot;+(et-st));
//        }

        try {
            obj =jointPoint.proceed();
            return obj;
        }finally {
            long et = System.currentTimeMillis();
            System.out.println(signatureStr+&quot;is end&quot;);
            System.out.println(signatureStr+&quot;경과시간 : &quot;+(et-st));
        }

    }
}</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_10_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);

        Student student = ctx.getBean(&quot;student&quot;,Student.class);
        student.getStudentInfo();

        Worker worker = ctx.getBean(&quot;worker&quot;,Worker.class);
        worker.getWorkerInfo();
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ae8ad1e5-a661-47db-946b-fbb9b5becc62/image.png" alt=""></p>
<h3 id="연습문제-2">연습문제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/27cc647d-73a9-4a8b-82e9-501507ec4475/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/be6ce7d8-7ec5-4f04-ad6d-8a82e67ec6f9/image.png" alt=""></p>
<p>Car.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_10_1;

public class Car {
    private String company;
    private String product;
    private int capRank;

    public void getCarInfo() {
        System.out.println(&quot;회사 : &quot;+getCompany());
        System.out.println(&quot;시총 : &quot;+getCapRank());
        System.out.println(&quot;제품 : &quot;+getProduct());
    }

    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public String getProduct() {
        return product;
    }
    public void setProduct(String product) {
        this.product = product;
    }
    public int getCapRank() {
        return capRank;
    }
    public void setCapRank(int capRank) {
        this.capRank = capRank;
    }



}</code></pre>
<p>Graphic.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_10_1;

public class Graphic {
    private String company;
    private int capRank;

    public void getGraphicInfo() {
        System.out.println(&quot;회사 : &quot;+getCompany());
        System.out.println(&quot;시총 : &quot;+getCapRank());
    }

    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public int getCapRank() {
        return capRank;
    }
    public void setCapRank(int capRank) {
        this.capRank = capRank;
    }


}</code></pre>
<p>LogAop.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_10_1;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LogAop {
    @Pointcut(&quot;within(com.javalec.spring_ex_10_1.*)&quot;)//범위 설정
    private void pointCutMethod() {}

    @Around(&quot;pointCutMethod()&quot;)
    public Object loggerAop(ProceedingJoinPoint jointPoint) throws Throwable {
        String signatureStr = jointPoint.getSignature().toShortString();
        System.out.println(&quot;@@@$$$ start ===&gt;&quot;+signatureStr);
        Object obj = null;

        try {
            obj =jointPoint.proceed();
            return obj;
        }finally {
            System.out.println(&quot;@@@$$$ end ===&gt;&quot;+signatureStr);
        }
    }
}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd&quot;&gt;

    &lt;aop:aspectj-autoproxy&gt;&lt;/aop:aspectj-autoproxy&gt;
    &lt;bean id=&quot;logAop&quot; class=&quot;com.javalec.spring_ex_10_1.LogAop&quot;&gt;&lt;/bean&gt;


    &lt;bean id=&quot;car&quot; class=&quot;com.javalec.spring_ex_10_1.Car&quot;&gt;
        &lt;property name=&quot;company&quot; value=&quot;테슬라&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;capRank&quot; value=&quot;6&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;product&quot; value=&quot;모델S&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;graphic&quot; class=&quot;com.javalec.spring_ex_10_1.Graphic&quot;&gt;
        &lt;property name=&quot;company&quot; value=&quot;엔비디아&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;capRank&quot; value=&quot;7&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_10_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);

        Car car = ctx.getBean(&quot;car&quot;,Car.class);
        car.getCarInfo();

        Graphic graphic = ctx.getBean(&quot;graphic&quot;,Graphic.class);
        graphic.getGraphicInfo();
    }
}</code></pre>
<h1 id="char-11mvc">Char 11.MVC</h1>
<h2 id="mvc기초">MVC기초</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8b6965e8-8037-4d21-b9c0-4cd96782e1ba/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/96b39352-dfc4-4517-8f33-008f7a932a3c/image.png" alt=""></p>
<p>MVC(MODEL-VIEW-CONTROLLER)
: 사용자 인터페이스, 데이터 논리 제어를 구현하는데 사용되는 소프트웨어 디자인 패턴
소프트 웨어의 비즈니스 로직과 화면을 구분</p>
<h1 id="char-12controller">Char 12.Controller</h1>
<ul>
<li><p>먼저 하기 전에  web.xml=&gt;filter 추가!(한글깨짐 처리)</p>
<pre><code class="language-java">&lt;filter&gt;
      &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;
      &lt;filter-class&gt;
          org.springframework.web.filter.CharacterEncodingFilter     
      &lt;/filter-class&gt;
      &lt;init-param&gt;
          &lt;param-name&gt;encoding&lt;/param-name&gt;   
          &lt;param-value&gt;UTF-8&lt;/param-value&gt;
      &lt;/init-param&gt;
      &lt;init-param&gt;
          &lt;param-name&gt;forceEncoding&lt;/param-name&gt;  
          &lt;param-value&gt;true&lt;/param-value&gt;
      &lt;/init-param&gt;
  &lt;/filter&gt;    

  &lt;filter-mapping&gt;
      &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;                 
  &lt;/filter-mapping&gt;</code></pre>
</li>
</ul>
<h2 id="controllerclass-제작">Controller.class 제작</h2>
<h3 id="controller로-클래스-제작-순서">Controller로 클래스 제작 순서</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/88e81780-c79b-485c-af1c-54a1957d20ea/image.png" alt=""></p>
<ol>
<li>@Controller를 이용한 클래스 생성</li>
<li>@RequestMapping을 이용한 요청 경로 지정</li>
<li>요청 처리 메소드 구현</li>
<li>view 이름 return</li>
</ol>
<h3 id="요청처리-메소드-제작">요청처리 메소드 제작</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/320740fc-103c-4378-879b-6a045dca61ac/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7956e69a-3a3d-4649-b247-4811a0f75dd7/image.png" alt=""></p>
<h3 id="view에-데이터-전달">View에 데이터 전달</h3>
<ul>
<li><code>Model</code> 클래스를 이용하여 데이터 전달</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ff618603-a1d4-4e5a-9f62-b1b50a592305/image.png" alt=""></p>
<h3 id="클래스에-requestmapping-적용">클래스에 @RequestMapping 적용</h3>
<ol>
<li><p>클래스에 @RequestMapping 적용
<img src="https://velog.velcdn.com/images/sofia_777/post/f0c25c63-78c5-45aa-9633-2dec8dcc8a0f/image.png" alt=""></p>
</li>
<li><p>메소드에 @RequestMapping 적용
<img src="https://velog.velcdn.com/images/sofia_777/post/89b8f1aa-0e10-46c3-bb9c-50925b7eb8fe/image.png" alt=""></p>
</li>
</ol>
<ol start="3">
<li>조합된 요청 경로 : /board/write
<img src="https://velog.velcdn.com/images/sofia_777/post/a21757e0-2a7d-4991-8c96-ca70f844bae9/image.png" alt=""></li>
</ol>
<h3 id="예제-1-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7cc96feb-d585-42ff-86c9-ceb6cbc7101a/image.png" alt=""></p>
<p>view.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    view.jsp입니다.---
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>HomeController</p>
<pre><code class="language-java">package com.javalec.spring_12_2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;board/view&quot;)
    public String view() {
        return &quot;board/view&quot;;
    }

}</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/63b85fe2-bfcd-4d89-85d6-1163ac51eea9/image.png" alt=""></p>
<h3 id="예제-2-1">예제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/dc6159f8-7fe4-4cf2-a3a8-178a2b5fcefd/image.png" alt=""></p>
<p>HomeController .java</p>
<pre><code class="language-java">package com.javalec.spring_12_3;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;board/title&quot;)
    public String title(Model model) {
        model.addAttribute(&quot;id&quot;,30);

        return &quot;board/title&quot;;
    }
}</code></pre>
<p>title.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    title.jsp입니다.
    id : ${id}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/0a5f090f-bc2d-4ff0-a9eb-56b56f786ec4/image.png" alt=""></p>
<h3 id="예제-3">예제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/2fd83935-5597-4090-a910-fe1380ddb3f2/image.png" alt=""></p>
<p>shopping.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    shopping.jsp입니다.
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>shopping2.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    shopping2.jsp입니다.
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>HomeController</p>
<pre><code class="language-java">package com.javalec.spring_12_5;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }


    @RequestMapping(&quot;shopping&quot;)
    public String shopping() {
        return &quot;shopping&quot;;
    }

}</code></pre>
<p>MyController</p>
<pre><code class="language-java">package com.javalec.spring_12_5;

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

@Controller
public class MyController {
    @RequestMapping(&quot;shopping2&quot;)
    public String shopping2() {
        return &quot;shopping2&quot;;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/850c52ae-1f93-4412-a9fd-684a3d2155dd/image.png" alt=""></p>
<h3 id="예제-4">예제 4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/70e23084-5b31-4d25-b112-61edd20f84e5/image.png" alt=""></p>
<p>HomeController.java</p>
<pre><code class="language-java">package com.javalec.spring_12_6;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
@RequestMapping(&quot;/board&quot;)
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }
    @RequestMapping(&quot;write&quot;)
    public String write(Model model) {
        model.addAttribute(&quot;id&quot;, &quot;aaa&quot;);

        return &quot;board/write&quot;;
    }
}</code></pre>
<p>write.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    write.jsp입니다.
    id : ${id}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/813a8b71-d7ae-4369-8ac5-f47f8ee900b6/image.png" alt=""></p>
<h3 id="예제-5">예제 5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c1343b19-6941-4824-a886-a9eee08d8a35/image.png" alt=""></p>
<p>HomeController .jsp</p>
<pre><code class="language-java">package com.javalec.spring_12_ex_1;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;board/content&quot;)
    public String view() {
        return &quot;board/content&quot;;
    }

}</code></pre>
<p>content.jsp</p>
<pre><code class="language-java">
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    content.jsp입니다.&lt;br&gt;
    &lt;!-- &lt;img src=&quot;spring_ex_12_1/google.png&quot;&gt; --&gt;
    &lt;!-- &lt;img src=&quot;/spring_ex_12_1/google.png&quot;&gt; --&gt;
    &lt;img src=&quot;../resources/google.png&quot;&gt;
    &lt;img src=&quot;../resources/googlelogo.png&quot;&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_12_ex_1&quot; /&gt;



&lt;/beans:beans&gt;</code></pre>
<h3 id="예제-6">예제 6</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7882c1ff-99d2-47f3-a2f2-0aa4dfdbb192/image.png" alt=""></p>
<p>HomeController</p>
<pre><code class="language-java">package com.javalec.spring_ex_12_1a;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        return &quot;home&quot;;
    }

    @RequestMapping(&quot;car/tesla&quot;)
    public String view() {
        return &quot;car/tesla&quot;;
    }

}</code></pre>
<p>servlet-context.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;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&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;
    &lt;resources mapping=&quot;/carResources/**&quot; location=&quot;/carResources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.javalec.spring_ex_12_1a&quot; /&gt;



&lt;/beans:beans&gt;</code></pre>
<p>tesla.jsp</p>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    tesla.jsp 입니다.&lt;br&gt;

    1. 모델S &lt;img src=&quot;../carResources/modelS.png&quot;&gt;&lt;br&gt;
    2. 모델X &lt;img src=&quot;../carResources/modelX.png&quot;&gt;&lt;br&gt;
    3. 모델Y &lt;img src=&quot;../carResources/modelY.png&quot;&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.06 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.06-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.06-Spring</guid>
            <pubDate>Wed, 12 Oct 2022 17:21:42 GMT</pubDate>
            <description><![CDATA[<p>저번 시간에 이어서</p>
<h1 id="char-8">Char 8</h1>
<h3 id="연습문제-1">연습문제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/f70c5455-c72e-4d23-8665-f6365fab157e/image.png" alt=""></p>
<p>oracle.account</p>
<pre><code class="language-java">emp.id=scott
emp.pw=tiger</code></pre>
<p>EmpConnection.java</p>
<pre><code class="language-java">package com.javalec.spring_8_1;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;

public class EmpConnection implements EnvironmentAware, InitializingBean {
    private Environment Env;
    private String empId;
    private String empPw;

    @Override
    public void setEnvironment(Environment environment) {
        setEnv(environment);//객체 생성 전 

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        setEmpId(Env.getProperty(&quot;emp.id&quot;));
        setEmpPw(Env.getProperty(&quot;emp.pw&quot;));

    }

    public Environment getEnv() {
        return Env;
    }

    public void setEnv(Environment env) {
        Env = env;
    }

    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }

    public String getEmpPw() {
        return empPw;
    }

    public void setEmpPw(String empPw) {
        this.empPw = empPw;
    }


}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd&quot;&gt;

    &lt;bean id=&quot;empConnection&quot; class=&quot;com.javalec.spring_8_1.EmpConnection&quot;&gt;&lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_8_1;

import java.io.IOException;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.io.support.ResourcePropertySource;

public class MainClass {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = new GenericXmlApplicationContext();
        ConfigurableEnvironment env = ctx.getEnvironment();
        MutablePropertySources propertySources = env.getPropertySources();

        try {
            propertySources.addLast(new ResourcePropertySource(&quot;classpath:oracle.account&quot;));
            //외부파일 가져올때 객체를 사용
            //예외처리 try catch (외부파일이 없을경우도 있기때문)
            System.out.println(env.getProperty(&quot;emp.id&quot;));
            System.out.println(env.getProperty(&quot;emp.pw&quot;));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(&quot;파일을 불러올 수 없습니다.&quot;);
        }
            GenericXmlApplicationContext gctx = (GenericXmlApplicationContext) ctx;
            gctx.load(&quot;ex_applicationCTX.xml&quot;);
            gctx.refresh();

            EmpConnection connection = gctx.getBean(&quot;empConnection&quot;, EmpConnection.class);

            System.out.println(&quot;emp ID : &quot;+connection.getEmpId());
            System.out.println(&quot;emp PW : &quot;+connection.getEmpPw());
    }
}</code></pre>
<h3 id="연습문제-2">연습문제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/23963c34-a25c-4f8e-bd0c-fe702130b1b0/image.png" alt=""></p>
<p>mssql.account</p>
<pre><code class="language-java">ms_student.id=stu101
ms_student.pw=1234</code></pre>
<p>mysql.account</p>
<pre><code class="language-java">my_student.id=stu201
my_student.pw=5678</code></pre>
<p>DbConnection.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_8_2;

public class DbConnection {
    private String mssqlId;
    private String mssqlPw;
    private String mysqlId;
    private String mysqlPw;
    public String getMssqlId() {
        return mssqlId;
    }
    public void setMssqlId(String mssqlId) {
        this.mssqlId = mssqlId;
    }
    public String getMssqlPw() {
        return mssqlPw;
    }
    public void setMssqlPw(String mssqlPw) {
        this.mssqlPw = mssqlPw;
    }
    public String getMysqlId() {
        return mysqlId;
    }
    public void setMysqlId(String mysqlId) {
        this.mysqlId = mysqlId;
    }
    public String getMysqlPw() {
        return mysqlPw;
    }
    public void setMysqlPw(String mysqlPw) {
        this.mysqlPw = mysqlPw;
    }
}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&quot;&gt;

    &lt;context:property-placeholder location=&quot;classpath:mssql.account, classpath:mysql.account&quot;/&gt;

    &lt;bean id=&quot;dbConnection&quot; class=&quot;com.javalec.spring_ex_8_2.DbConnection&quot;&gt;
        &lt;property name=&quot;mssqlId&quot;&gt;
            &lt;value&gt;${ms_student.id}&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;mssqlPw&quot;&gt;
            &lt;value&gt;${ms_student.pw}&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;mysqlId&quot;&gt;
            &lt;value&gt;${my_student.id}&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;mysqlPw&quot;&gt;
            &lt;value&gt;${my_student.pw}&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_8_2;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;applicationCTX.xml&quot;);

        DbConnection dbConnection = ctx.getBean(&quot;dbConnection&quot;,DbConnection.class);
        System.out.println(&quot;mssqlID : &quot;+dbConnection.getMssqlId());
        System.out.println(&quot;mssqlPW : &quot;+dbConnection.getMssqlPw());
        System.out.println(&quot;mysqlID : &quot;+dbConnection.getMysqlId());
        System.out.println(&quot;mysqlPW : &quot;+dbConnection.getMysqlPw());
    }
}</code></pre>
<h3 id="연습문제-3">연습문제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c34e9d33-478c-4d7e-a2ce-e725771772aa/image.png" alt=""></p>
<p>DbInfo.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_8_3;

public class DbInfo {
    private String driver;
    private String url;
    private String user;
    private String password;
    public String getDriver() {
        return driver;
    }
    public void setDriver(String driver) {
        this.driver = driver;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUser() {
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}</code></pre>
<p>oracleCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;dbInfo&quot; class=&quot;com.javalec.spring_ex_8_3.DbInfo&quot;&gt;
        &lt;property name=&quot;driver&quot;&gt;
            &lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;url&quot;&gt;
            &lt;value&gt;jdbc:oracle:thin:@localhost:1521:ORCL&lt;/value&gt;    
        &lt;/property&gt;
        &lt;property name=&quot;user&quot;&gt;
            &lt;value&gt;scott&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;password&quot;&gt;
            &lt;value&gt;tiger&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>mysqlCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;dbInfo&quot; class=&quot;com.javalec.spring_ex_8_3.DbInfo&quot;&gt;
        &lt;property name=&quot;driver&quot;&gt;
            &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;url&quot;&gt;
            &lt;value&gt;jdbc:mysql://localhost:3306/JSPDB&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;user&quot;&gt;
            &lt;value&gt;root&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;password&quot;&gt;
            &lt;value&gt;mysql&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_8_3;

import java.util.Scanner;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String config=&quot;&quot;;
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();

        if (str.equals(&quot;oracle&quot;)) {
            config = &quot;oracle&quot;;
        }else if (str.equals(&quot;mysql&quot;)) {
            config = &quot;mysql&quot;;
        }

        scanner.close();

        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        ctx.getEnvironment().setActiveProfiles(config);
        ctx.load(&quot;oracleCTX.xml&quot;,&quot;mysqlCTX.xml&quot;);

        DbInfo dbInfo = ctx.getBean(&quot;dbInfo&quot;,DbInfo.class);
        System.out.println(&quot;driver : &quot;+dbInfo.getDriver());
        System.out.println(&quot;url : &quot;+dbInfo.getUrl());
        System.out.println(&quot;user : &quot;+dbInfo.getUser());
        System.out.println(&quot;password : &quot;+dbInfo.getPassword());
    }
}</code></pre>
<h3 id="연습문제-4">연습문제 4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/125e8cac-db6e-4cba-9629-47e044825fd5/image.png" alt=""></p>
<p>jdbc.driver</p>
<pre><code class="language-java">oracle=oracle.jdbc.driver.OracleDRiver
mysql=com.mysql.jdbc.Driver</code></pre>
<p>JdbcDriver.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_8_4;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;

public class JdbcDriver implements EnvironmentAware, InitializingBean {
    private Environment env;
    private String oracleJdbcDriver;
    private String mysqlJdbcDriver;

    @Override
    public void afterPropertiesSet() throws Exception {
        setOracleJdbcDriver(env.getProperty(&quot;oracle&quot;));
        setMysqlJdbcDriver(env.getProperty(&quot;mysql&quot;));
    }

    @Override
    public void setEnvironment(Environment environment) {
        setEnv(environment);

    }


    public Environment getEnv() {
        return env;
    }

    public void setEnv(Environment env) {
        this.env = env;
    }

    public String getOracleJdbcDriver() {
        return oracleJdbcDriver;
    }

    public void setOracleJdbcDriver(String oracleJdbcDriver) {
        this.oracleJdbcDriver = oracleJdbcDriver;
    }

    public String getMysqlJdbcDriver() {
        return mysqlJdbcDriver;
    }

    public void setMysqlJdbcDriver(String mysqlJdbcDriver) {
        this.mysqlJdbcDriver = mysqlJdbcDriver;
    }


}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;


    &lt;bean id=&quot;jdbcDriver&quot; class=&quot;com.javalec.spring_ex_8_4.JdbcDriver&quot;&gt;&lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_ex_8_4;

import java.io.IOException;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.io.support.ResourcePropertySource;

public class MainClass {
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = new GenericXmlApplicationContext(&quot;applicationCTX.xml&quot;);
        ConfigurableEnvironment env = ctx.getEnvironment();
        MutablePropertySources propertySources = env.getPropertySources();

        try {
            propertySources.addLast(new ResourcePropertySource(&quot;classpath:jdbc.driver&quot;));
            System.out.println(env.getProperty(&quot;oracle&quot;));
            System.out.println(env.getProperty(&quot;mysql&quot;));
        } catch (IOException e) {//외부파일이 없을 수도 있기 때문에 예외처리 
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        GenericXmlApplicationContext gCtx = (GenericXmlApplicationContext) ctx;
        //캐스팅
        gCtx.load(&quot;applicationCTX.xml&quot;);



        JdbcDriver jdbcDriver = gCtx.getBean(&quot;jdbcDriver&quot;,JdbcDriver.class);
        System.out.println(&quot;OracleJdbcDriver : &quot;+jdbcDriver.getOracleJdbcDriver());
        System.out.println(&quot;MysqlJdbcDriver : &quot;+jdbcDriver.getMysqlJdbcDriver());

    }
}</code></pre>
<hr>
<p>당시 오전에 발표하고, 평가시험 진행 등의 이유로 진도를 많이 나가지 않음 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.05 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.05-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.05-Spring</guid>
            <pubDate>Wed, 12 Oct 2022 17:15:18 GMT</pubDate>
            <description><![CDATA[<h1 id="char-6">Char 6</h1>
<p>(저번에 이어서)</p>
<h2 id="xml과-java를-같이-사용">XML과 JAVA를 같이 사용</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/07203a01-ccd3-4a62-a031-416798301ee3/image.png" alt=""></p>
<ol>
<li>xml 파일을 만들어서 java를 포함시키는 예</li>
</ol>
<h4 id="studentjava">Student.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_3;

import java.util.ArrayList;

public class Student {
    private String name;
    private int age;
    private ArrayList&lt;String&gt; hobbys;
    private double height;
    private double weight;

    public Student(String name, int age, ArrayList&lt;String&gt; hobbys) {
        super();
        this.name = name;
        this.age = age;
        this.hobbys = hobbys;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public ArrayList&lt;String&gt; getHobbys() {
        return hobbys;
    }
    public void setHobbys(ArrayList&lt;String&gt; hobbys) {
        this.hobbys = hobbys;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
}
</code></pre>
<h4 id="applicationcconfigjava">ApplicationcConfig.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_3;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
    @Bean
    public Student student1() {
        ArrayList&lt;String&gt; hobbys = new ArrayList&lt;String&gt;();
        hobbys.add(&quot;수영&quot;);
        hobbys.add(&quot;요리&quot;);

        Student student = new Student(&quot;홍길동&quot;, 20, hobbys);
        student.setHeight(180);
        student.setWeight(80);

        return student;
    }


}</code></pre>
<h4 id="mainclassjava">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_3;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
//        AnnotationConfigApplicationContext ctx =  new AnnotationConfigApplicationContext(ApplicationConfig.class);

        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);
        Student student1 = ctx.getBean(&quot;student1&quot;,Student.class);
        System.out.println(&quot;이름 :&quot;+student1.getName());
        System.out.println(&quot;나이 :&quot;+student1.getAge());
        System.out.println(&quot;취미 :&quot;+student1.getHobbys());
        System.out.println(&quot;신장 :&quot;+student1.getHeight());
        System.out.println(&quot;몸무게 :&quot;+student1.getWeight());

        System.out.println(&quot;========================================&quot;);


        Student student2 = ctx.getBean(&quot;student2&quot;,Student.class);
        System.out.println(&quot;이름 :&quot;+student2.getName());
        System.out.println(&quot;나이 :&quot;+student2.getAge());
        System.out.println(&quot;취미 :&quot;+student2.getHobbys());
        System.out.println(&quot;신장 :&quot;+student2.getHeight());
        System.out.println(&quot;몸무게 :&quot;+student2.getWeight());

    }
}</code></pre>
<h4 id="applicationctxxml">applicationCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&quot;&gt;

    &lt;context:annotation-config&gt;&lt;/context:annotation-config&gt;
    &lt;bean class=&quot;com.javalec.spring_6_3.ApplicationConfig&quot;&gt;&lt;/bean&gt;

    &lt;bean id=&quot;student2&quot; class=&quot;com.javalec.spring_6_3.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길순&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;30&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg&gt;
            &lt;list&gt;
                &lt;value&gt;마라톤&lt;/value&gt;
                &lt;value&gt;요리&lt;/value&gt;
            &lt;/list&gt;
        &lt;/constructor-arg&gt;
        &lt;property name=&quot;height&quot; value=&quot;190&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;weight&quot; value=&quot;70&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="pomxml에-코드-추가">pom.xml에 코드 추가</h4>
<pre><code class="language-java">&lt;!-- cglib --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.kenai.nbpwr&lt;/groupId&gt;
            &lt;artifactId&gt;net-sf-cglib&lt;/artifactId&gt;
            &lt;version&gt;2.1.3-201003011305&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<ol start="2">
<li>자바파일에 xml파일을 포함하는 방법</li>
</ol>
<h4 id="studentjava-1">Student.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_3;

import java.util.ArrayList;

public class Student {
    private String name;
    private int age;
    private ArrayList&lt;String&gt; hobbys;
    private double height;
    private double weight;

    public Student(String name, int age, ArrayList&lt;String&gt; hobbys) {
        super();
        this.name = name;
        this.age = age;
        this.hobbys = hobbys;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public ArrayList&lt;String&gt; getHobbys() {
        return hobbys;
    }
    public void setHobbys(ArrayList&lt;String&gt; hobbys) {
        this.hobbys = hobbys;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
}
</code></pre>
<h4 id="applicationcconfigjava-1">ApplicationcConfig.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_4;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource(&quot;classpath:applicationCTX.xml&quot;)
public class ApplicationConfig {
    @Bean
    public Student student1() {
        ArrayList&lt;String&gt; hobbys = new ArrayList&lt;String&gt;();
        hobbys.add(&quot;수영&quot;);
        hobbys.add(&quot;요리&quot;);

        Student student = new Student(&quot;홍길동&quot;, 20, hobbys);
        student.setHeight(180);
        student.setWeight(80);

        return student;
    }


}</code></pre>
<h4 id="mainclassjava-1">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_4;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx =  new AnnotationConfigApplicationContext(ApplicationConfig.class);

//        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);
        Student student1 = ctx.getBean(&quot;student1&quot;,Student.class);
        System.out.println(&quot;이름 :&quot;+student1.getName());
        System.out.println(&quot;나이 :&quot;+student1.getAge());
        System.out.println(&quot;취미 :&quot;+student1.getHobbys());
        System.out.println(&quot;신장 :&quot;+student1.getHeight());
        System.out.println(&quot;몸무게 :&quot;+student1.getWeight());

        System.out.println(&quot;========================================&quot;);


        Student student2 = ctx.getBean(&quot;student2&quot;,Student.class);
        System.out.println(&quot;이름 :&quot;+student2.getName());
        System.out.println(&quot;나이 :&quot;+student2.getAge());
        System.out.println(&quot;취미 :&quot;+student2.getHobbys());
        System.out.println(&quot;신장 :&quot;+student2.getHeight());
        System.out.println(&quot;몸무게 :&quot;+student2.getWeight());

    }
}</code></pre>
<h4 id="applicationctxxml-1">applicationCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;


    &lt;bean id=&quot;student2&quot; class=&quot;com.javalec.spring_6_4.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길순&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;30&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg&gt;
            &lt;list&gt;
                &lt;value&gt;마라톤&lt;/value&gt;
                &lt;value&gt;요리&lt;/value&gt;
            &lt;/list&gt;
        &lt;/constructor-arg&gt;
        &lt;property name=&quot;height&quot; value=&quot;190&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;weight&quot; value=&quot;70&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="pomxml에-코드-추가-1">pom.xml에 코드 추가</h4>
<pre><code class="language-java">&lt;!-- cglib --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.kenai.nbpwr&lt;/groupId&gt;
            &lt;artifactId&gt;net-sf-cglib&lt;/artifactId&gt;
            &lt;version&gt;2.1.3-201003011305&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<hr>
<h3 id="예제-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8ea23650-cd9b-41b7-9526-b3d2228fb7eb/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/89eafb75-a41c-4056-984d-97c660495c41/image.png" alt=""></p>
<h4 id="employeejava">Employee.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_1;

import java.util.ArrayList;

public class Employee {
    private String name;
    private int salary;
    private ArrayList&lt;String&gt; license;

    public Employee(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public ArrayList&lt;String&gt; getLicense() {
        return license;
    }

    public void setLicense(ArrayList&lt;String&gt; license) {
        this.license = license;
    }



}</code></pre>
<h4 id="employeeinfojava">EmployeeInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_1;

public class EmployeeInfo {
    private Employee employee;

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }
}</code></pre>
<h4 id="employeectxxml">employeeCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;employee1&quot; class=&quot;com.javalec.spring_ex_6_1.Employee&quot;&gt;
        &lt;constructor-arg value=&quot;임영웅&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;salary&quot;&gt;
            &lt;value&gt;300&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;license&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;정보처리기사&lt;/value&gt;
                &lt;value&gt;sqlD&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;employeeInfo1&quot; class=&quot;com.javalec.spring_ex_6_1.EmployeeInfo&quot;&gt;
        &lt;property name=&quot;employee&quot;&gt;
            &lt;ref bean=&quot;employee1&quot;/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="employeectx2xml">employeeCTX2.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;employee3&quot; class=&quot;com.javalec.spring_ex_6_1.Employee&quot;&gt;
        &lt;constructor-arg value=&quot;이찬원&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;salary&quot;&gt;
            &lt;value&gt;200&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;license&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;정보처리산업기사&lt;/value&gt;
                &lt;value&gt;컴활 1급&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainemployeejava">MainEmployee.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainEmployee {
    public static void main(String[] args) {
        String configLoc1 = &quot;classpath:employeeCTX.xml&quot;;
        String configLoc2 = &quot;classpath:employeeCTX2.xml&quot;;

        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1,configLoc2);

        Employee employee1 = ctx.getBean(&quot;employee1&quot;,Employee.class);
        System.out.println(employee1.getName());
        System.out.println(employee1.getSalary());
        System.out.println(employee1.getLicense());
        System.out.println(&quot;============================================&quot;);


        EmployeeInfo employeeInfo = ctx.getBean(&quot;employeeInfo1&quot;,EmployeeInfo.class);
        Employee employee2 = employeeInfo.getEmployee();
        System.out.println(employee2.getName());
        System.out.println(employee2.getSalary());
        System.out.println(employee2.getLicense());
        System.out.println(&quot;============================================&quot;);


        Employee employee3 = ctx.getBean(&quot;employee3&quot;,Employee.class);
        System.out.println(employee3.getName());
        System.out.println(employee3.getSalary());
        System.out.println(employee3.getLicense());

    }
}</code></pre>
<h3 id="예제-2">예제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/5fcba515-39fc-45b9-b008-2b1eaa7c5a48/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/843d9db9-77a5-4204-b6a3-9e714b1e8de6/image.png" alt=""></p>
<h4 id="professorjava">Professor.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_2;

import java.util.ArrayList;

public class Professor {
    private String name;
    private int age;
    private ArrayList&lt;String&gt; subject;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public ArrayList&lt;String&gt; getSubject() {
        return subject;
    }
    public void setSubject(ArrayList&lt;String&gt; subject) {
        this.subject = subject;
    }
    public Professor(String name) {
        super();
        this.name = name;
    }
}</code></pre>
<h4 id="professorinfojava">ProfessorInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_2;

public class ProfessorInfo {
    private Professor professor;

    public Professor getProfessor() {
        return professor;
    }

    public void setProfessor(Professor professor) {
        this.professor = professor;
    }
}</code></pre>
<h4 id="professorctxxml">professorCTX.xml</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_2;

import java.util.ArrayList;

public class Professor {
    private String name;
    private int age;
    private ArrayList&lt;String&gt; subject;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public ArrayList&lt;String&gt; getSubject() {
        return subject;
    }
    public void setSubject(ArrayList&lt;String&gt; subject) {
        this.subject = subject;
    }
    public Professor(String name) {
        super();
        this.name = name;
    }
}</code></pre>
<h4 id="professorctx2xml">professorCTX2.xml</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_2;

import java.util.ArrayList;

public class Professor {
    private String name;
    private int age;
    private ArrayList&lt;String&gt; subject;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public ArrayList&lt;String&gt; getSubject() {
        return subject;
    }
    public void setSubject(ArrayList&lt;String&gt; subject) {
        this.subject = subject;
    }
    public Professor(String name) {
        super();
        this.name = name;
    }
}</code></pre>
<h4 id="mainprofessorjava">MainProfessor.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_2;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainProfessor {
    public static void main(String[] args) {
        String configLoc1 = &quot;classpath:professorCTX.xml&quot;;
        String configLoc2 = &quot;classpath:professorCTX2.xml&quot;;

        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1,configLoc2);

        Professor professor1 = ctx.getBean(&quot;professor1&quot;,Professor.class);
        System.out.println(professor1.getName());
        System.out.println(professor1.getAge());
        System.out.println(professor1.getSubject());
        System.out.println(&quot;============================================&quot;);

        ProfessorInfo professorInfo = ctx.getBean(&quot;professorInfo1&quot;,ProfessorInfo.class);
        Professor professor2 = professorInfo.getProfessor();
        System.out.println(professor2.getName());
        System.out.println(professor2.getAge());
        System.out.println(professor2.getSubject());
        System.out.println(&quot;============================================&quot;);

        Professor professor3 = ctx.getBean(&quot;professor3&quot;,Professor.class);
        System.out.println(professor3.getName());
        System.out.println(professor3.getAge());
        System.out.println(professor3.getSubject());
    }
}</code></pre>
<h3 id="예제-3">예제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/da848e1d-582a-4c1f-a3e8-b7449f23e28a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/614891f4-f2b4-4f8d-b16d-634d1f82b386/image.png" alt=""></p>
<h4 id="singerjava">Singer.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_3;

import java.util.ArrayList;

public class Singer {
    private String name;
    private int member;
    private ArrayList&lt;String&gt; song;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getMember() {
        return member;
    }
    public void setMember(int member) {
        this.member = member;
    }
    public ArrayList&lt;String&gt; getSong() {
        return song;
    }
    public void setSong(ArrayList&lt;String&gt; song) {
        this.song = song;
    }
    public Singer(String name) {
        super();
        this.name = name;
    }
}</code></pre>
<h4 id="singerinfojava">SingerInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_3;

public class SingerInfo {
    private Singer singer;

    public Singer getSinger() {
        return singer;
    }

    public void setSinger(Singer singer) {
        this.singer = singer;
}</code></pre>
<h4 id="singerctxxml">SingerCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;singer1&quot; class=&quot;com.javalec.spring_ex_6_3.Singer&quot;&gt;
        &lt;constructor-arg value=&quot;방탄소년단&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;member&quot;&gt;
            &lt;value&gt;7&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;song&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;다이너마이트&lt;/value&gt;
                &lt;value&gt;페이크 러브&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;singerInfo1&quot; class=&quot;com.javalec.spring_ex_6_3.SingerInfo&quot;&gt; 
        &lt;property name=&quot;singer&quot;&gt;
            &lt;ref bean=&quot;singer1&quot;/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="singerctx2xml">SingerCTX2.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;


    &lt;bean id=&quot;singer3&quot; class=&quot;com.javalec.spring_ex_6_3.Singer&quot;&gt;
        &lt;constructor-arg value=&quot;블랙핑크&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;member&quot;&gt;
            &lt;value&gt;4&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;song&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;아이스크림&lt;/value&gt;
                &lt;value&gt;하우 유 라이크 댓&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainsingerjava">MainSinger.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_3;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainSinger {
    public static void main(String[] args) {

    String configLoc1 = &quot;classpath:SingerCTX.xml&quot;;
    String configLoc2 = &quot;classpath:SingerCTX2.xml&quot;;

    AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1,configLoc2);

    Singer singer1 = ctx.getBean(&quot;singer1&quot;,Singer.class);
    System.out.println(singer1.getName());
    System.out.println(singer1.getMember());
    System.out.println(singer1.getSong());
    System.out.println(&quot;============================================&quot;);


    SingerInfo singerInfo1 = ctx.getBean(&quot;singerInfo1&quot;,SingerInfo.class);
    Singer singer2 = singerInfo1.getSinger();
    System.out.println(singer2.getName());
    System.out.println(singer2.getMember());
    System.out.println(singer2.getSong());
    System.out.println(&quot;============================================&quot;);

    Singer singer3 = ctx.getBean(&quot;singer3&quot;,Singer.class);
    System.out.println(singer3.getName());
    System.out.println(singer3.getMember());
    System.out.println(singer3.getSong());
    }
}</code></pre>
<h3 id="예제-4">예제 4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8c4d11b1-aa5d-4b59-b3c5-cb7987255730/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/98fb2772-5049-41a2-a994-6f6531de2ff7/image.png" alt=""></p>
<h4 id="animationjava">Animation.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_4;

import java.util.ArrayList;

public class Animation {
    private String name;
    private int years;
    private ArrayList&lt;String&gt; character;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getYears() {
        return years;
    }
    public void setYears(int years) {
        this.years = years;
    }
    public ArrayList&lt;String&gt; getCharacter() {
        return character;
    }
    public void setCharacter(ArrayList&lt;String&gt; character) {
        this.character = character;
    }
    public Animation(String name) {
        super();
        this.name = name;
    }


}</code></pre>
<h4 id="animationinfojava">AnimationInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_4;

public class AnimationInfo {
    private Animation animation;

    public Animation getAnimation() {
        return animation;
    }

    public void setAnimation(Animation animation) {
        this.animation = animation;
    }

}</code></pre>
<h4 id="animationctxxml">animationCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;


    &lt;bean id=&quot;animation1&quot; class=&quot;com.javalec.spring_ex_6_4.Animation&quot;&gt;
        &lt;constructor-arg value=&quot;원피스&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;years&quot;&gt;
            &lt;value&gt;1999&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;character&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;루피&lt;/value&gt;
                &lt;value&gt;조로&lt;/value&gt;
                &lt;value&gt;상디&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;animationInfo1&quot; class=&quot;com.javalec.spring_ex_6_4.AnimationInfo&quot;&gt; 
        &lt;property name=&quot;animation&quot;&gt;
            &lt;ref bean=&quot;animation1&quot;/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<h4 id="animationctx2xml">animationCTX2.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;animation3&quot; class=&quot;com.javalec.spring_ex_6_4.Animation&quot;&gt;
        &lt;constructor-arg value=&quot;블리치&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;years&quot;&gt;
            &lt;value&gt;2004&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;character&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;이치고&lt;/value&gt;
                &lt;value&gt;오리히메&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainanimationjava">MainAnimation.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_4;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainAnimation {
    public static void main(String[] args) {

        String configLoc1 = &quot;classpath:animationCTX.xml&quot;;
        String configLoc2 = &quot;classpath:animationCTX2.xml&quot;;

        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1,configLoc2);

        Animation animation1 = ctx.getBean(&quot;animation1&quot;,Animation.class);
        System.out.println(animation1.getName());
        System.out.println(animation1.getYears());
        System.out.println(animation1.getCharacter());
        System.out.println(&quot;============================================&quot;);


        AnimationInfo animationInfo1 = ctx.getBean(&quot;animationInfo1&quot;,AnimationInfo.class);
        Animation animation2 = animationInfo1.getAnimation();
        System.out.println(animation2.getName());
        System.out.println(animation2.getYears());
        System.out.println(animation2.getCharacter() );
        System.out.println(&quot;============================================&quot;);

        Animation animation3 = ctx.getBean(&quot;animation3&quot;,Animation.class);
        System.out.println(animation3.getName());
        System.out.println(animation3.getYears());
        System.out.println(animation3.getCharacter() );


        }
}</code></pre>
<h3 id="예제-5">예제 5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/94c6f5e7-a5bf-49c7-8ea3-184b6f548154/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/d3a18851-c565-4c9f-81f9-3634e1daec71/image.png" alt=""></p>
<h4 id="nasdaqjava">Nasdaq.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_5;

import java.util.ArrayList;

public class Nasdaq {
    private String stock;
    private int ranking;
    private ArrayList&lt;String&gt; production;
    public String getStock() {
        return stock;
    }
    public void setStock(String stock) {
        this.stock = stock;
    }
    public int getRanking() {
        return ranking;
    }
    public void setRanking(int ranking) {
        this.ranking = ranking;
    }
    public ArrayList&lt;String&gt; getProduction() {
        return production;
    }
    public void setProduction(ArrayList&lt;String&gt; production) {
        this.production = production;
    }
    public Nasdaq(String stock) {
        super();
        this.stock = stock;
    }


}</code></pre>
<h4 id="nasdaqinfojava">NasdaqInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_5;

public class NasdaqInfo {
    private Nasdaq nasdaq;

    public Nasdaq getNasdaq() {
        return nasdaq;
    }

    public void setNasdaq(Nasdaq nasdaq) {
        this.nasdaq = nasdaq;
    }


}</code></pre>
<h4 id="nasdaqctxxml">nasdaqCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;nasdaq1&quot; class=&quot;com.javalec.spring_ex_6_5.Nasdaq&quot;&gt;
        &lt;constructor-arg value=&quot;Tesla&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;ranking&quot;&gt;
            &lt;value&gt;6&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;production&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;모델 X&lt;/value&gt;
                &lt;value&gt;모델 Y&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;nasdaqInfo1&quot; class=&quot;com.javalec.spring_ex_6_5.NasdaqInfo&quot;&gt; 
        &lt;property name=&quot;nasdaq&quot;&gt;
            &lt;ref bean=&quot;nasdaq1&quot;/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="nasdaqctx2xml">nasdaqCTX.2xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;nasdaq3&quot; class=&quot;com.javalec.spring_ex_6_5.Nasdaq&quot;&gt;
        &lt;constructor-arg value=&quot;Nvidia&quot;&gt;&lt;/constructor-arg&gt;
        &lt;property name=&quot;ranking&quot;&gt;
            &lt;value&gt;7&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;production&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;RTX 3080&lt;/value&gt;
                &lt;value&gt;RTX 2080&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<h4 id="mainnasdaqjava">MainNasdaq.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_6_5;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainNasdaq {
    public static void main(String[] args) {

        String configLoc1 = &quot;classpath:nasdaqCTX.xml&quot;;
        String configLoc2 = &quot;classpath:nasdaqCTX2.xml&quot;;

        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1,configLoc2);

        Nasdaq nasdaq1 = ctx.getBean(&quot;nasdaq1&quot;,Nasdaq.class);
        System.out.println(nasdaq1.getStock());
        System.out.println(nasdaq1.getRanking());
        System.out.println(nasdaq1.getProduction());
        System.out.println(&quot;============================================&quot;);


        NasdaqInfo nasdaqInfo1 = ctx.getBean(&quot;nasdaqInfo1&quot;,NasdaqInfo.class);
        Nasdaq nasdaq2 = nasdaqInfo1.getNasdaq();
        System.out.println(nasdaq2.getStock());
        System.out.println(nasdaq2.getRanking());
        System.out.println(nasdaq2.getProduction());
        System.out.println(&quot;============================================&quot;);

        Nasdaq nasdaq3 = ctx.getBean(&quot;nasdaq3&quot;,Nasdaq.class);
        System.out.println(nasdaq3.getStock());
        System.out.println(nasdaq3.getRanking());
        System.out.println(nasdaq3.getProduction());
        }
}</code></pre>
<hr>
<h1 id="char-7-생명-주기life-cycle-와-범위scope">Char 7. 생명 주기(life cycle) 와 범위(scope)</h1>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/012d1584-ab59-4446-af3c-45673741a55c/image.png" alt=""></p>
<p>.refresh() -&gt; 생성과 설정을 별도로 분리 한 경우 사용(초기화함수)</p>
<h3 id="예제-1-1">예제 1</h3>
<h4 id="studentjava-2">Student.java</h4>
<pre><code class="language-java">package com.javalec.spring_7_1;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}</code></pre>
<h4 id="applicationctxxml-2">applicationCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;student&quot; class=&quot;com.javalec.spring_7_1.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길순&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;30&quot;&gt;&lt;/constructor-arg&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainclassjava-2">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_7_1;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        ctx.load(&quot;classpath:applicationCTX.xml&quot;);
        ctx.refresh();

        Student student = ctx.getBean(&quot;student&quot;,Student.class);// 객체 정보 가지고 오기
        System.out.println(&quot;이름 : &quot;+student.getName());
        System.out.println(&quot;나이 : &quot;+student.getAge());

        ctx.close();
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/9665c4e6-787a-4ce6-948a-d99eb26fd912/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/25f19de9-fca4-41b5-bfa3-fa8960181449/image.png" alt=""></p>
<h2 id="initializingbean-disposablebean">InitializingBean, DisposableBean</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/a4208d01-224a-41ce-a4f0-f94c6bd62c46/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b7dc8086-3c5c-4838-b684-c1ca88d15357/image.png" alt=""></p>
<h3 id="1-오버라이징-이용">1. 오버라이징 이용</h3>
<p>=&gt; interface사용
Student.java</p>
<h3 id="예제-2-1">예제 2</h3>
<pre><code class="language-java">package com.javalec.spring_7_2;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Student implements InitializingBean, DisposableBean{
    private String name;
    private int age;


    @Override//먼저 호출됨
    public void afterPropertiesSet() throws Exception {
        System.out.println(&quot;afterPropertiesSet()&quot;);
    }// 객체 생성시 먼저 호출됨.

    @Override
    public void destroy() throws Exception {
        System.out.println(&quot;destroy()&quot;);
    }//객체 소멸 후에 호출


    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}</code></pre>
<h3 id="2-annotation-사용">2. Annotation 사용</h3>
<h3 id="예제-3-1">예제 3</h3>
<p>OtherStudent.java</p>
<pre><code class="language-java">package com.javalec.spring_7_2;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class OtherStudent {
    private String name;
    private int age;

    @PostConstruct
    public void initMethod() {
        System.out.println(&quot;initMethod()&quot;);
    }//객체 생성 후에 호출

    @PreDestroy
    public void destoryMethod() {
        System.out.println(&quot;destoryMethod()&quot;);
    }//객체 소멸 중 호출

    public OtherStudent(String name, int age) {//생성자
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}</code></pre>
<p>설정파일 =&gt;     xmlns:context=&quot;<a href="http://www.springframework.org/schema/context&quot;">http://www.springframework.org/schema/context&quot;</a> 추가</p>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&quot;&gt;

    &lt;context:annotation-config&gt;&lt;/context:annotation-config&gt;
    &lt;!-- initMethod(),destoryMethod() 출력--&gt;


    &lt;bean id=&quot;student&quot; class=&quot;com.javalec.spring_7_2.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길순&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;30&quot;&gt;&lt;/constructor-arg&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;otherstudent&quot; class=&quot;com.javalec.spring_7_2.OtherStudent&quot;&gt;
        &lt;constructor-arg value=&quot;홍길자&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;50&quot;&gt;&lt;/constructor-arg&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_7_2;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        ctx.load(&quot;classpath:applicationCTX.xml&quot;);
        ctx.refresh();

        ctx.close();
//        ctx.close();
    }
}</code></pre>
<p>만약에 Annotation 오류 발생시 아래의 코드 추가</p>
<pre><code class="language-java">&lt;!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;javax.annotation&lt;/groupId&gt;
    &lt;artifactId&gt;javax.annotation-api&lt;/artifactId&gt;
    &lt;version&gt;1.3.2&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
<h2 id="spring-bean-범위scope">Spring Bean 범위(scope)</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c98d62ea-697f-44f3-9d23-2098592ef414/image.png" alt=""></p>
<h3 id="예제-4-1">예제 4</h3>
<p>Student.java</p>
<pre><code class="language-java">package com.javalec.spring_7_3;

public class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;student&quot; class=&quot;com.javalec.spring_7_3.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길순&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;30&quot;&gt;&lt;/constructor-arg&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_7_3;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);

        Student student1 = ctx.getBean(&quot;student&quot;,Student.class);
        System.out.println(&quot;이름 : &quot;+student1.getName());
        System.out.println(&quot;나이 : &quot;+student1.getAge());

        System.out.println(&quot;==============================&quot;);


        Student student2 = ctx.getBean(&quot;student&quot;,Student.class);
        student2.setName(&quot;홍길자&quot;);
        student2.setAge(100);
        System.out.println(&quot;이름 : &quot;+student2.getName());
        System.out.println(&quot;나이 : &quot;+student2.getAge());


        System.out.println(&quot;==============================&quot;);
        System.out.println(&quot;이름 : &quot;+student1.getName());
        System.out.println(&quot;나이 : &quot;+student1.getAge());

        System.out.println(&quot;==============================&quot;);
        if (student1.equals(student2)) {
            System.out.println(&quot;student1 == student2&quot;);
        } else {
            System.out.println(&quot;student1 != student2&quot;);
        }
    }
}</code></pre>
<h1 id="char-8-외부-파일을-이용한-설정">Char 8. 외부 파일을 이용한 설정</h1>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/2f80de01-7a8d-412b-8605-b168ed100f7b/image.png" alt=""></p>
<p>Enviroment 객체 이용하여 외부의 설정값을 가지고 와서 이용</p>
<ol>
<li>어플리케이션의 기초인 ConfigurableApplicationContext로 ctx 파일 생성</li>
</ol>
<p>2. ctx.getEnvironment을 통해 얻은 객체를 ConfigurableEnvironment에서 생성한 Environment 객체 env에 담는다.</p>
<p>3. env.getPropertySources();로 프로퍼티소스를 얻어와서 MutablePropertySources에서 생성한 인스턴스에 넣는다.   getPropertySources();를 해주는 이유는 Environment 객체 안에는 각각의 정보를 갖고있는 PropertySources라는 객체가 있어서 다 구해옴</p>
<p>4. PropertySources에서 추가와 추출 가능 (추가 : addLast  / 추출 : getProperty)</p>
<h3 id="예제-5-1">예제 5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/629d2462-105d-4dcb-988e-688a0735e442/image.png" alt=""></p>
<p>admin.properties</p>
<pre><code class="language-java">admin.id=abcde
admin.pw=12345</code></pre>
<p>AdminConnection.java</p>
<pre><code class="language-java">package com.javalec.spring_8_1;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;

public class AdminConnection implements InitializingBean, EnvironmentAware {
   private Environment env; // Environment는 프로젝트당 1개만 생성 가능
   private String adminId;
   private String adminPw;

   @Override//객체 생성되기 전에 호출됨
   public void setEnvironment(Environment environment) {
      System.out.println(&quot;setEnvironment&quot;);
      setEnv(environment);
   }

   @Override // 객체가 생성될 때 호출
   public void afterPropertiesSet() throws Exception {
      System.out.println(&quot;afterPropertiesSet()&quot;);
      setAdminId(env.getProperty(&quot;admin.id&quot;));
      setAdminPw(env.getProperty(&quot;admin.pw&quot;));
   }

   public Environment getEnv() {
      return env;
   }
   public void setEnv(Environment env) {
      this.env = env;
   }
   public String getAdminId() {
      return adminId;
   }
   public void setAdminId(String adminId) {
      this.adminId = adminId;
   }
   public String getAdminPw() {
      return adminPw;
   }
   public void setAdminPw(String adminPw) {
      this.adminPw = adminPw;
   }
}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;adminConnection&quot; class=&quot;com.javalec.spring_8_1.AdminConnection&quot;&gt;&lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_8_1;

import java.io.IOException;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.io.support.ResourcePropertySource;

public class MainClass {
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = new GenericXmlApplicationContext();
        ConfigurableEnvironment env = ctx.getEnvironment();
        MutablePropertySources propertySources = env.getPropertySources();
        //외부 파일 설정

        try {
            propertySources.addLast(new ResourcePropertySource(&quot;classpath:admin.properties&quot;));
            System.out.println(env.getProperty(&quot;admin.id&quot;));
            System.out.println(env.getProperty(&quot;admin.pw&quot;));
        } catch (IOException e) {//외부파일이 없을 수도 있기 때문에 예외처리 
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        GenericXmlApplicationContext gctx = (GenericXmlApplicationContext) ctx;
        //캐스팅
        gctx.load(&quot;applicationCTX.xml&quot;);
        gctx.refresh();

        AdminConnection adminConnection = gctx.getBean(&quot;adminConnection&quot;,AdminConnection.class);
        System.out.println(&quot;admin ID : &quot;+adminConnection.getAdminId());
        System.out.println(&quot;admin PW : &quot;+adminConnection.getAdminPw());
    }
}</code></pre>
<h2 id="프로퍼티-파일을-이용한-설정">프로퍼티 파일을 이용한 설정</h2>
<ol>
<li>스프링 설정 XML파일에 프로퍼티 파일을 명시<ul>
<li>*.xml 필수값
[Namespaces 탭-context 체크]
xmlns:context=&quot;<a href="http://www.springframework.org/schema/context&quot;">http://www.springframework.org/schema/context&quot;</a></li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/e62fc735-b7d5-4995-ae7d-35cf51d5b977/image.png" alt=""></p>
<p>*.외부파일 사용(admin.properties, sub_admin.properties)
&lt;context:property-placeholder location=&quot;classpath:admin.properties, classpath:sub_admin.properties&quot; /&gt;</p>
<p>*.참조값 사용</p>
<pre><code>&lt;property name=&quot;adminId&quot;&gt;
&lt;value&gt;${admin.id}&lt;/value&gt;
&lt;/property&gt;</code></pre><h3 id="예제-6">예제 6</h3>
<p>admin.properties</p>
<pre><code class="language-java">admin.id=abcde
admin.pw=12345</code></pre>
<p>sub_admin.properties</p>
<pre><code class="language-java">sub_admin.id=fghij
sub_admin.pw=67890</code></pre>
<p>AdminConnection.java</p>
<pre><code class="language-java">package com.javalec.spring_8_2;

public class AdminConnection {
   private String adminId;
   private String adminPw;
   private String sub_adminId;
   private String sub_adminPw;



   public String getSub_adminId() {
       return sub_adminId;
   }
   public void setSub_adminId(String sub_adminId) {
       this.sub_adminId = sub_adminId;
   }
   public String getSub_adminPw() {
        return sub_adminPw;
   }
   public void setSub_adminPw(String sub_adminPw) {
        this.sub_adminPw = sub_adminPw;
   }


   public String getAdminId() {
          return adminId;
   }
   public void setAdminId(String adminId) {
      this.adminId = adminId;
   }
   public String getAdminPw() {
      return adminPw;
   }
   public void setAdminPw(String adminPw) {
      this.adminPw = adminPw;
   }
}</code></pre>
<p>applicationCTX.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&quot;&gt;

    &lt;context:property-placeholder location=&quot;classpath:admin.properties, classpath:sub_admin.properties&quot;/&gt;

    &lt;bean id=&quot;adminConnection&quot; class=&quot;com.javalec.spring_8_2.AdminConnection&quot;&gt;
        &lt;property name=&quot;adminId&quot;&gt;
            &lt;value&gt;${admin.id}&lt;/value&gt;
            &lt;!-- 외부파일에서 데이터를 가지고 와서  AdminConnection.java파일의 adminId에 저장됨--&gt;
        &lt;/property&gt;
        &lt;property name=&quot;adminPw&quot;&gt;
            &lt;value&gt;${admin.pw}&lt;/value&gt;
            &lt;!-- 외부파일에서 데이터를 가지고 와서  AdminConnection.java파일의 adminPw에 저장됨--&gt;
        &lt;/property&gt;
        &lt;property name=&quot;sub_adminId&quot;&gt;
            &lt;value&gt;${sub_admin.id}&lt;/value&gt;
            &lt;!-- 외부파일에서 데이터를 가지고 와서  AdminConnection.java파일의 sub_adminId에 저장됨--&gt;
        &lt;/property&gt;
        &lt;property name=&quot;sub_adminPw&quot;&gt;
            &lt;!-- 외부파일에서 데이터를 가지고 와서  AdminConnection.java파일의 sub_adminPw에 저장됨--&gt;
            &lt;value&gt;${sub_admin.pw}&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_8_2;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
//        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;applicationCTX.xml&quot;);
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;applicationCTX.xml&quot;);
        AdminConnection connection =  ctx.getBean(&quot;adminConnection&quot;,AdminConnection.class);
        System.out.println(&quot;adminID : &quot;+connection.getAdminId());
        System.out.println(&quot;adminPW : &quot;+connection.getAdminPw());
        System.out.println(&quot;sub_adminID : &quot;+connection.getSub_adminId());
        System.out.println(&quot;sub_adminPW : &quot;+connection.getSub_adminPw());
    }
}</code></pre>
<p>2.스프링 설정 JAVA파일에 프로퍼티 파일을 명시 
<img src="https://velog.velcdn.com/images/sofia_777/post/6d527f0f-3f4a-4898-bdc9-34d7aae6a3d2/image.png" alt=""></p>
<p>public static PropertySourcesPlaceholderConfigurer properties() {}
=&gt;xml 의 context:property-placeholder 동일
(외부파일 사용)</p>
<p>@Value(&quot;${admin.id}&quot;)
private String adminId;
=&gt;value 어노테이션 이용해서 값을 setting -&gt; 참조값을 set 역할로 저장</p>
<h3 id="예제-7">예제 7</h3>
<p>admin.properties</p>
<pre><code class="language-java">admin.id=abcde
admin.pw=12345</code></pre>
<p>sub_admin.properties</p>
<pre><code class="language-java">sub_admin.id=fghij
sub_admin.pw=67890</code></pre>
<p>AdminConnection.java</p>
<pre><code class="language-java">package com.javalec.spring_8_2_2;

public class AdminConnection {
   private String adminId;
   private String adminPw;
   private String sub_adminId;
   private String sub_adminPw;



   public String getSub_adminId() {
       return sub_adminId;
   }
   public void setSub_adminId(String sub_adminId) {
       this.sub_adminId = sub_adminId;
   }
   public String getSub_adminPw() {
        return sub_adminPw;
   }
   public void setSub_adminPw(String sub_adminPw) {
        this.sub_adminPw = sub_adminPw;
   }


   public String getAdminId() {
          return adminId;
   }
   public void setAdminId(String adminId) {
      this.adminId = adminId;
   }
   public String getAdminPw() {
      return adminPw;
   }
   public void setAdminPw(String adminPw) {
      this.adminPw = adminPw;
   }
}</code></pre>
<p>ApplicationConfig.java</p>
<pre><code class="language-java">package com.javalec.spring_8_2_2;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

@Configuration 
public class ApplicationConfig {
    @Value(&quot;${admin.id}&quot;)//참조값 형식으로 넣어야함
    private String adminId;

    @Value(&quot;${admin.pw}&quot;)//참조값 형식으로 넣어야함
    private String adminPw;

    @Value(&quot;${sub_admin.id}&quot;)//참조값 형식으로 넣어야함
    private String sub_adminId;

    @Value(&quot;${sub_admin.pw}&quot;)//참조값 형식으로 넣어야함
    private String sub_adminPw;


    @Bean
    public static  PropertySourcesPlaceholderConfigurer propertices() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();

        Resource[] locations = new Resource[2];
        locations[0] = new ClassPathResource(&quot;admin.properties&quot;);
        locations[1] = new ClassPathResource(&quot;sub_admin.properties&quot;);
        //외부 파일을 읽음
        configurer.setLocations(locations);

        return configurer;
    }

    @Bean
    public AdminConnection adminConnection() {//AdminConnection가 클래스 adminConnection는 아이디
        AdminConnection adminConnection = new AdminConnection();
        adminConnection.setAdminId(adminId);
        //AdminConnection의 adminId로 세팅됨
        adminConnection.setAdminPw(adminPw);
        //AdminConnection의 adminPw로 세팅됨
        adminConnection.setSub_adminId(sub_adminId);
        //AdminConnection의 sub_adminId로 세팅됨
        adminConnection.setSub_adminPw(sub_adminPw);
        //AdminConnection의 sub_adminPw로 세팅됨

        return adminConnection;

    }
}</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_8_2_2;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
//        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;applicationCTX.xml&quot;);
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);

        AdminConnection connection =  ctx.getBean(&quot;adminConnection&quot;,AdminConnection.class);
        System.out.println(&quot;adminID : &quot;+connection.getAdminId());
        System.out.println(&quot;adminPW : &quot;+connection.getAdminPw());
        System.out.println(&quot;sub_adminID : &quot;+connection.getSub_adminId());
        System.out.println(&quot;sub_adminPW : &quot;+connection.getSub_adminPw());
    }
}</code></pre>
<h2 id="프로파일profile-속성을-이용한-설정">프로파일(profile) 속성을 이용한 설정</h2>
<p>-&gt; 이런 경우 보통 사용자가 쓰는 운영서버와 개발 서버를 따로두는 경우를 이용하여 설정</p>
<ol>
<li>Xml 설정 파일을 이용하는 경우
xml 파일에 작성
<img src="https://velog.velcdn.com/images/sofia_777/post/2c532a29-7bcb-42fd-aa48-3f596ff49199/image.png" alt=""></li>
</ol>
<h3 id="예제-8">예제 8</h3>
<p>ServerInfo.java</p>
<pre><code class="language-java">package com.javalec.spring_8_3_1;

public class ServerInfo {
    private String ipNum;
    private String PortNum;
    public String getIpNum() {
        return ipNum;
    }
    public void setIpNum(String ipNum) {
        this.ipNum = ipNum;
    }
    public String getPortNum() {
        return PortNum;
    }
    public void setPortNum(String portNum) {
        PortNum = portNum;
    }


}</code></pre>
<p>applicationCTX_run.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;
    profile=&quot;run&quot;&gt;

    &lt;bean id=&quot;serverInfo&quot; class=&quot;com.javalec.spring_8_3_1.ServerInfo&quot;&gt;
        &lt;property name=&quot;ipNum&quot;&gt;
            &lt;value&gt;213.186.229.29&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;portNum&quot;&gt;
            &lt;value&gt;80&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>applicationCTX_dev.xml</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;
    profile=&quot;dev&quot;
    &gt;

    &lt;bean id=&quot;serverInfo&quot; class=&quot;com.javalec.spring_8_3_1.ServerInfo&quot;&gt;
        &lt;property name=&quot;ipNum&quot;&gt;
            &lt;value&gt;localhost&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;portNum&quot;&gt;
            &lt;value&gt;8181&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_8_3_1;

import java.util.Scanner;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String config=&quot;&quot;;
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();

        if (str.equals(&quot;dev&quot;)) {
            config=&quot;dev&quot;;//개발
        } else if (str.equals(&quot;run&quot;)) {
            config=&quot;run&quot;;//운영
        }

        scanner.close();

        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        ctx.getEnvironment().setActiveProfiles(config);
        ctx.load(&quot;applicationCTX_dev.xml&quot;,&quot;applicationCTX_run.xml&quot;);
        ServerInfo info = ctx.getBean(&quot;serverInfo&quot;,ServerInfo.class);
        System.out.println(&quot;ip : &quot;+info.getIpNum());
        System.out.println(&quot;port : &quot;+info.getPortNum());
    }
}</code></pre>
<p>2.JAVA 설정 파일을 이용하는 경우
Annotation부터 작성
<img src="https://velog.velcdn.com/images/sofia_777/post/c3b7eb93-339c-4fb5-b4f9-1e6208af3aec/image.png" alt=""></p>
<h3 id="예제-9">예제 9</h3>
<p>ServerInfo.java</p>
<pre><code class="language-java">package com.javalec.spring_8_3_2;

public class ServerInfo {
    private String ipNum;
    private String PortNum;

    public String getIpNum() {
        return ipNum;
    }
    public void setIpNum(String ipNum) {
        this.ipNum = ipNum;
    }
    public String getPortNum() {
        return PortNum;
    }
    public void setPortNum(String portNum) {
        PortNum = portNum;
    }


}</code></pre>
<p>ApplicationConfigDev.java</p>
<pre><code class="language-java">package com.javalec.spring_8_3_2;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile(&quot;dev&quot;)
public class ApplicationConfigDev {

    @Bean
    public ServerInfo serverInfo() {
        ServerInfo info = new ServerInfo();
        info.setIpNum(&quot;localhost&quot;);
        info.setPortNum(&quot;8181&quot;);

        return info;
    }



}</code></pre>
<p>ApplicationConfigRun.java</p>
<pre><code class="language-java">package com.javalec.spring_8_3_2;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile(&quot;run&quot;)
public class ApplicationConfigRun {
    @Bean
    public ServerInfo serverInfo() {
        ServerInfo info = new ServerInfo();
        info.setIpNum(&quot;213.186.229.29&quot;);
        info.setPortNum(&quot;80&quot;);

        return info;

    }

}</code></pre>
<p>MainClass.java</p>
<pre><code class="language-java">package com.javalec.spring_8_3_2;

import java.util.Scanner;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String config=&quot;&quot;;
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();

        if (str.equals(&quot;dev&quot;)) {
            config=&quot;dev&quot;;//개발
        } else if (str.equals(&quot;run&quot;)) {
            config=&quot;run&quot;;//운영
        }

        scanner.close();

//        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
//        ctx.getEnvironment().setActiveProfiles(config);
//        ctx.load(&quot;applicationCTX_dev.xml&quot;,&quot;applicationCTX_run.xml&quot;);

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.getEnvironment().setActiveProfiles(config);
        ctx.register(ApplicationConfigDev.class, ApplicationConfigRun.class);
        ctx.refresh();

        ServerInfo info = ctx.getBean(&quot;serverInfo&quot;,ServerInfo.class);
        System.out.println(&quot;ip : &quot;+info.getIpNum());
        System.out.println(&quot;port : &quot;+info.getPortNum());
    }
}</code></pre>
<h1 id="reference">reference</h1>
<ul>
<li><a href="https://yulfsong.tistory.com/22">https://yulfsong.tistory.com/22</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.10.04 Spring]]></title>
            <link>https://velog.io/@sofia_777/2022.10.04Spring</link>
            <guid>https://velog.io/@sofia_777/2022.10.04Spring</guid>
            <pubDate>Tue, 11 Oct 2022 18:01:07 GMT</pubDate>
            <description><![CDATA[<h1 id="chap3">chap3</h1>
<p>이어서</p>
<h3 id="예제-5">예제 5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/e0225096-55ca-4a93-9bb0-8444dbd8839c/image.png" alt=""></p>
<h4 id="won2dollarjava">Won2Dollar.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_4;

public class Won2Dollar {
    public void exchange(int money) {
        double dollar = money / 1200;
        System.out.println(money+&quot;원은 $&quot;+dollar+&quot;입니다.&quot;);
    }
}</code></pre>
<h4 id="mywon2dollarjava">MyWon2Dollar.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_4;

public class MyWon2Dollar {
    private Won2Dollar won2Dollar;

    private int money;

    public void exch() {
        won2Dollar.exchange(money);
    }

    public Won2Dollar getWon2Dollar() {
        return won2Dollar;
    }

    public void setWon2Dollar(Won2Dollar won2Dollar) {
        this.won2Dollar = won2Dollar;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}</code></pre>
<h4 id="won2dollarctxxml">won2DollarCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;!-- Won2Dollar Bean 객체 생성 --&gt;
    &lt;bean id=&quot;won2Dollar&quot; class=&quot;com.javalec.spring_ex_3_4.Won2Dollar&quot;&gt;&lt;/bean&gt;

    &lt;bean id=&quot;myWon2Dollar&quot; class=&quot;com.javalec.spring_ex_3_4.MyWon2Dollar&quot;&gt;
        &lt;property name=&quot;won2Dollar&quot;&gt;
            &lt;ref bean=&quot;won2Dollar&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;money&quot; value=&quot;3600&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainwon2dollarjava">MainWon2Dollar.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_4;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainWon2Dollar {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:won2DollarCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        //객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)
        MyWon2Dollar myWon2Dollar = ctx.getBean(&quot;myWon2Dollar&quot;,MyWon2Dollar.class);


        myWon2Dollar.exch();
    }
}</code></pre>
<h3 id="예제-6">예제 6</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/32cb75d1-1514-4fa0-972d-dcc0dfd0ba2b/image.png" alt=""></p>
<h4 id="threejava">Three.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_5;

public class Three {
    public void process(int i) {
        if (i % 3 == 0) {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수입니다.&quot;);
        }else {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수가 아닙니다.&quot;);
        }
    }
}</code></pre>
<h4 id="mythreejava">MyThree.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_5;

public class MyThree {
    private Three three;

    private int num;

    public void pc() {
        three.process(num);
    }

    public Three getThree() {
        return three;
    }

    public void setThree(Three three) {
        this.three = three;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }package com.javalec.spring_ex_3_5;

public class Three {
    public void process(int i) {
        if (i % 3 == 0) {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수입니다.&quot;);
        }else {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수가 아닙니다.&quot;);
        }
    }
}package com.javalec.spring_ex_3_5;

public class Three {
    public void process(int i) {
        if (i % 3 == 0) {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수입니다.&quot;);
        }else {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수가 아닙니다.&quot;);
        }
    }
}package com.javalec.spring_ex_3_5;

public class Three {
    public void process(int i) {
        if (i % 3 == 0) {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수입니다.&quot;);
        }else {
            System.out.println(&quot;입력된 수 : &quot;+i+&quot;는 3의 배수가 아닙니다.&quot;);
        }
    }
}

}</code></pre>
<h4 id="threectxxml">threeCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;


    &lt;bean id=&quot;three&quot; class=&quot;com.javalec.spring_ex_3_5.Three&quot;&gt;&lt;/bean&gt;

    &lt;bean id=&quot;myThree&quot; class=&quot;com.javalec.spring_ex_3_5.MyThree&quot;&gt;
        &lt;property name=&quot;three&quot;&gt;
            &lt;ref bean=&quot;three&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;num&quot; value=&quot;129&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<h4 id="mainthreejava">MainThree.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_5;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainThree {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:threeCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        //객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)

        MyThree mythree = ctx.getBean(&quot;myThree&quot;, MyThree.class);

        mythree.pc();
    }
}</code></pre>
<h3 id="예제-7">예제 7</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/e2188a83-3ebb-4ddf-9a17-86359659901d/image.png" alt=""></p>
<h4 id="divandremainsjava">DivAndRemains.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_6;

public class DivAndRemains {
    public void process(int num) {
        int ten = num / 10;
        int one = num % 10;

        if (one == ten ) {
            System.out.println(&quot;입력된 수 : &quot;+ num+&quot;는 10의 자리와 1의 자리가 같습니다.&quot;);
        }else {
            System.out.println(&quot;입력된 수 : &quot;+ num+&quot;는 10의 자리와 1의 자리가 다릅니다.&quot;);
        }
    }
}</code></pre>
<h4 id="mydivandremainsjava">MydivAndRemains.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_6;

public class MyDivAndRemains {
    private DivAndRemains divAndRemains;

    private int num;

    public void pc() {
        divAndRemains.process(num);
    }

    public DivAndRemains getDivAndRemains() {
        return divAndRemains;
    }

    public void setDivAndRemains(DivAndRemains divAndRemains) {
        this.divAndRemains = divAndRemains;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}</code></pre>
<h4 id="divandremainsctxxml">divAndRemainsCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;divAndRemains&quot; class=&quot;com.javalec.spring_ex_3_6.DivAndRemains&quot;&gt;&lt;/bean&gt;

    &lt;bean id=&quot;myDivAndRemains&quot; class=&quot;com.javalec.spring_ex_3_6.MyDivAndRemains&quot;&gt;
        &lt;property name=&quot;divAndRemains&quot;&gt;
            &lt;ref bean=&quot;divAndRemains&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;num&quot; value=&quot;77&quot; &gt;&lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<h4 id="divandremainsjava-1">DivAndRemains.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_6;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainDivAndRemains {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:divAndRemainsCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        //객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)

        MyDivAndRemains myDivAndRemains = ctx.getBean(&quot;myDivAndRemains&quot;, MyDivAndRemains.class);

        myDivAndRemains.pc();
    }
}</code></pre>
<h3 id="예제-8">예제 8</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/34360ba9-a21d-49c4-b27a-9e44be83642c/image.png" alt=""></p>
<h4 id="rectangeljava">Rectangel.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_7;

public class Rectangel {
    public void process(int x, int y) {
        if ( (x&lt;= 100 &amp;&amp; x &lt;=200)&amp;&amp;  (y&lt;= 100 &amp;&amp; y &lt;=200)) {
            System.out.println(&quot;(&quot;+x+&quot;,&quot;+y+&quot;)는 사각형 안에 있습니다.&quot;);
        }else {
            System.out.println(&quot;(&quot;+x+&quot;,&quot;+y+&quot;)는 사각형 안에 없습니다.&quot;);
        }
    }
}</code></pre>
<h4 id="myrectangeljava">MyRectangel.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_7;

public class MyRectangel {
    private Rectangel rectangel;

    private int x;
    private int y;

    public void pc() {
        rectangel.process(x, y);
    }

    public Rectangel getRectangel() {
        return rectangel;
    }

    public void setRectangel(Rectangel rectangel) {
        this.rectangel = rectangel;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }


}</code></pre>
<h4 id="rectangelctxxml">rectangelCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;rectangel&quot; class=&quot;com.javalec.spring_ex_3_7.Rectangel&quot;&gt;&lt;/bean&gt;


    &lt;bean id=&quot;myRectangel&quot; class=&quot;com.javalec.spring_ex_3_7.MyRectangel&quot;&gt;
        &lt;property name=&quot;rectangel&quot;&gt;
            &lt;ref bean=&quot;rectangel&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;x&quot; value=&quot;150&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;y&quot; value=&quot;150&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<h4 id="mainrectangeljava">MainRectangel.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_7;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainRectangel {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:rectangelCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        //객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)

        MyRectangel myRectangel = ctx.getBean(&quot;myRectangel&quot;, MyRectangel.class);

        myRectangel.pc();
    }
}</code></pre>
<h3 id="예제-9">예제 9</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7ae9d7b6-51b5-4075-8a84-24129f613718/image.png" alt=""></p>
<h4 id="medianjava">Median.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_8;

public class Median {
    public void process(int a, int b, int c) {
        if ((a&lt;b &amp;&amp; b&lt;c)||(c&lt;b &amp;&amp; b&lt;a)) {
            System.out.println(&quot;입력된 정수가 &quot;+a+&quot;와 &quot;+b+&quot;와 &quot;+c+&quot;의 중간값은 &quot;+b);
        }else if ((b&lt;a &amp;&amp; a&lt;c)||(c&lt;a &amp;&amp; a&lt;b))  {
            System.out.println(&quot;입력된 정수가 &quot;+a+&quot;와 &quot;+b+&quot;와 &quot;+c+&quot;의 중간값은 &quot;+a);
        }else if ((b&lt;c &amp;&amp; c&lt;a)||(a&lt;c &amp;&amp; c&lt;b)) {
            System.out.println(&quot;입력된 정수가 &quot;+a+&quot;와 &quot;+b+&quot;와 &quot;+c+&quot;의 중간값은 &quot;+c);
        }
    }
}</code></pre>
<h4 id="mymedianjava">MyMedian.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_8;

public class MyMedian {
    private Median median;

    private int num1;
    private int num2;
    private int num3;

    public void pc() {
        median.process(num1,num2,num3);
    }

    public Median getMedian() {
        return median;
    }

    public void setMedian(Median median) {
        this.median = median;
    }

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public int getNum3() {
        return num3;
    }

    public void setNum3(int num3) {
        this.num3 = num3;
    }


}</code></pre>
<h4 id="medianctxxml">medianCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;median&quot; class=&quot;com.javalec.spring_ex_3_8.Median&quot;&gt;&lt;/bean&gt;

    &lt;bean id=&quot;myMedian&quot; class=&quot;com.javalec.spring_ex_3_8.MyMedian&quot; &gt;
        &lt;property name=&quot;median&quot;&gt;
            &lt;ref bean=&quot;median&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;num1&quot; value=&quot;20&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;num2&quot; value=&quot;100&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;num3&quot; value=&quot;33&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainmedianjava">MainMedian.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_8;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainMedian {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:medianCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        //객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)

        MyMedian myMedian = ctx.getBean(&quot;myMedian&quot;,MyMedian.class);

        myMedian.pc();
    }
}</code></pre>
<h3 id="예제-10">예제 10</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/279db494-1a66-41ab-a14e-8e2a0b1d8047/image.png" alt=""></p>
<h4 id="evennumberjava">EvenNumber.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_9;

public class EvenNumber {
    public void process(int num) {
        int sum=0;
        for (int j = 0; j &lt;=num ; j+=2) {
            sum+=j;
        }
        System.out.println(num+&quot;까지의 짝수들의 합은 &quot;+sum);
    }
}</code></pre>
<h4 id="myevennumberjava">MyEvenNumber.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_9;

public class MyEvenNumber {
    private EvenNumber evenNumber;

    private int num;

    public void pc() {
        evenNumber.process(num);
    }

    public EvenNumber getEvenNumber() {
        return evenNumber;
    }

    public void setEvenNumber(EvenNumber evenNumber) {
        this.evenNumber = evenNumber;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}</code></pre>
<h4 id="evennumberctxxml">evenNumberCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;


    &lt;bean id=&quot;evenNumber&quot; class=&quot;com.javalec.spring_ex_3_9.EvenNumber&quot;&gt;&lt;/bean&gt;

    &lt;bean id=&quot;myEvenNumber&quot; class=&quot;com.javalec.spring_ex_3_9.MyEvenNumber&quot;&gt;
        &lt;property name=&quot;evenNumber&quot;&gt;
            &lt;ref bean=&quot;evenNumber&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;num&quot; value=&quot;10&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainevennumberjava">MainEvenNumber.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_9;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainEvenNumber {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:evenNumberCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        //객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)

        MyEvenNumber myEvenNumber = ctx.getBean(&quot;myEvenNumber&quot;, MyEvenNumber.class);

        myEvenNumber.pc();
    }
}</code></pre>
<h3 id="예제-11">예제 11</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ecdb1244-bb03-4710-b76c-627896144cf7/image.png" alt=""></p>
<h4 id="capitaljava">Capital.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_10;

public class Capital {
    public void alphabet(String str) {
        char c =&#39;A&#39;;
        char c2 = str.charAt(0);

        for (char i = c2; i &gt;= c; i--) {
            for (char j = c; j &lt;= i; j++) {
                System.out.print(j);
            }
            System.out.println();
        }
    }
}</code></pre>
<h4 id="mycapitaljava">MyCapital.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_10;

public class MyCapital {
    private Capital capital;
    private String str;

    public void alpha() {
        capital.alphabet(str);
    }

    public Capital getCapital() {
        return capital;
    }

    public void setCapital(Capital capital) {
        this.capital = capital;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}</code></pre>
<h4 id="capitalctxxml">capitalCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;capital&quot; class=&quot;com.javalec.spring_ex_3_10.Capital&quot;&gt;&lt;/bean&gt;

    &lt;bean id=&quot;myCapital&quot; class=&quot;com.javalec.spring_ex_3_10.MyCapital&quot;&gt;
        &lt;property name=&quot;capital&quot;&gt;
            &lt;ref bean=&quot;capital&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;str&quot; value=&quot;F&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="maincapitaljava">MainCapital.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_10;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainCapital {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:capitalCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);

        MyCapital myCapital =ctx.getBean(&quot;myCapital&quot;,MyCapital.class);

        myCapital.alpha();
    }
}</code></pre>
<h1 id="chap4-di---2">chap4. DI - 2</h1>
<h2 id="스프링-프로퍼티-설정">스프링 프로퍼티 설정</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/543de814-b6b5-4269-9f8a-59e7f13c8b4c/image.png" alt=""></p>
<h2 id="스프링-컨테이너">스프링 컨테이너</h2>
<p>: 자바객체의 생명주기를 관리하며 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할
여기서 자바 객체를 스프링에서는 _<strong>Bean</strong>_이라고 함.</p>
<p>DI와 IoC의 원리가 스프링 컨테이너에 적용됨</p>
<p>개발자는 NEW연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸 시킬 수있는데 스프림 컨테이너가 이 역할을 대신해줌. → 제어흐름을 외부에서 관리
객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 줌</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/9fdc185b-09ae-49fd-a13c-cb73b3a106c4/image.png" alt=""></p>
<h3 id="예제-1">예제 1</h3>
<h4 id="bmicalculatorjava">BMICalculator.java</h4>
<pre><code class="language-java">package com.javalec.spring_4_1;

public class BMICalculator {
    private double lowWeight;
    private double normal;
    private double overWeight;
    private double obesity;

    public void bmiCalculator(double weight , double height) {
        double h = height * 0.01;
        double result = weight / (h*h);

        System.out.println(&quot;BMI 지수 : &quot;+(int)result);

        if (result&gt;obesity) {
            System.out.println(&quot;비만입니다.&quot;);
        }else if (result&gt;overWeight) {
            System.out.println(&quot;과체중입니다.&quot;);
        }else if (result&gt;normal) {
            System.out.println(&quot;정상입니다..&quot;);
        }else {
            System.out.println(&quot;저체중입니다.&quot;);
        }
    }

    public double getLowWeight() {
        return lowWeight;
    }
    public void setLowWeight(double lowWeight) {
        this.lowWeight = lowWeight;
    }
    public double getNormal() {
        return normal;
    }
    public void setNormal(double normal) {
        this.normal = normal;
    }
    public double getOverWeight() {
        return overWeight;
    }
    public void setOverWeight(double overWeight) {
        this.overWeight = overWeight;
    }
    public double getObesity() {
        return obesity;
    }
    public void setObesity(double obesity) {
        this.obesity = obesity;
    }
}</code></pre>
<h4 id="myinfojava">MyInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_4_1;

import java.util.ArrayList;

public class MyInfo {
    private String name;
    private double height;
    private double weight;
    private ArrayList&lt;String&gt; hobbys;
    private BMICalculator bmiCalculator;


    public void bmiCalculator() {
        bmiCalculator.bmiCalculator(weight, height);
    }
    //몸무게와 키 필드값을 넘김

    public void getInfo() {
        System.out.println(&quot;이름: &quot;+name);
        System.out.println(&quot;키: &quot;+height);
        System.out.println(&quot;몸무게: &quot;+weight);
        System.out.println(&quot;취미: &quot;+hobbys);

        bmiCalculator();
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
    public ArrayList&lt;String&gt; getHobbys() {
        return hobbys;
    }
    public void setHobbys(ArrayList&lt;String&gt; hobbys) {
        this.hobbys = hobbys;
    }
    public BMICalculator getBmiCalculator() {
        return bmiCalculator;
    }
    public void setBmiCalculator(BMICalculator bmiCalculator) {
        this.bmiCalculator = bmiCalculator;
    }



}</code></pre>
<h4 id="myinfoctxxml">myInfoCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;bmiCalculator&quot; class=&quot;com.javalec.spring_4_1.BMICalculator&quot;&gt;
        &lt;property name=&quot;lowWeight&quot; value=&quot;18.5&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;normal&quot;&gt;
            &lt;value&gt;23&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;overWeight&quot;&gt;
            &lt;value&gt;25&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;obesity&quot;&gt;
            &lt;value&gt;30&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;myInfo&quot; class=&quot;com.javalec.spring_4_1.MyInfo&quot;&gt;
        &lt;property name=&quot;name&quot;&gt;
            &lt;value&gt;홍길동&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;height&quot;&gt;
            &lt;value&gt;187&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;weight&quot;&gt;
            &lt;value&gt;84&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;hobbys&quot;&gt;
            &lt;list&gt;
                &lt;value&gt;수영&lt;/value&gt;
                &lt;value&gt;요리 &lt;/value&gt;
                &lt;value&gt;독서&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
        &lt;property name=&quot;bmiCalculator&quot;&gt;
            &lt;ref bean=&quot;bmiCalculator&quot;/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainclassjava">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_4_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String configLoc =  &quot;classpath:myInfoCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        MyInfo myInfo = ctx.getBean(&quot;myInfo&quot;,MyInfo.class);

        myInfo.getInfo();
        ctx.close();

    }
}</code></pre>
<hr>
<h1 id="char5-di-활용">Char5 DI 활용</h1>
<h2 id="의존관계">의존관계</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/6ad7d7bc-de5f-4ca8-b574-79f269217bd0/image.png" alt=""></p>
<p>Student가 StudentInfo에 의존하고 있으며, 값을 StudentInfo에서 세팅하고 생성</p>
<h3 id="예제-2">예제 2</h3>
<h4 id="studentjava">Student.java</h4>
<pre><code class="language-java">package com.javalec.spring_5_1;

public class Student {
    private String name;
    private String age;
    private String gradeNum;
    private String ClassNum;

    public Student(String name, String age, String gradeNum, String classNum) {
        this.name = name;
        this.age = age;
        this.gradeNum = gradeNum;
        ClassNum = classNum;
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getGradeNum() {
        return gradeNum;
    }
    public void setGradeNum(String gradeNum) {
        this.gradeNum = gradeNum;
    }
    public String getClassNum() {
        return ClassNum;
    }
    public void setClassNum(String classNum) {
        ClassNum = classNum;
    }
}</code></pre>
<h4 id="studentinfojava">StudentInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_5_1;

public class StudentInfo {
    private Student student;

    public StudentInfo(Student student) {
        this.student = student;
    }

    public void getStudentInfo() {
        System.out.println(&quot;이름: &quot;+student.getName());
        System.out.println(&quot;나이: &quot;+student.getAge());
        System.out.println(&quot;학년: &quot;+student.getGradeNum());
        System.out.println(&quot;반: &quot;+student.getClassNum());
        System.out.println(&quot;=========================&quot;);
    }

    public void setStudent(Student student) {
        this.student = student;
    }
}</code></pre>
<h4 id="applicationctxxml">applicationCTX.xml</h4>
<p>=&gt; 생성자에서 설정한 매개변수만큼 constructor의 값을 입력 필요</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;student1&quot; class=&quot;com.javalec.spring_5_1.Student&quot;&gt;
        &lt;constructor-arg&gt;
            &lt;value&gt;홍길동&lt;/value&gt;
        &lt;/constructor-arg&gt;
        &lt;constructor-arg&gt;
            &lt;value&gt;10살&lt;/value&gt;
        &lt;/constructor-arg&gt;
        &lt;constructor-arg&gt;
            &lt;value&gt;3학년&lt;/value&gt;
        &lt;/constructor-arg&gt;
        &lt;constructor-arg&gt;
            &lt;value&gt;2반&lt;/value&gt;
        &lt;/constructor-arg&gt;
    &lt;/bean&gt;


    &lt;bean id=&quot;student2&quot; class=&quot;com.javalec.spring_5_1.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길순&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;9살&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;2학년&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;1반&quot;&gt;&lt;/constructor-arg&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;studentInfo&quot; class=&quot;com.javalec.spring_5_1.StudentInfo&quot;&gt;
        &lt;constructor-arg&gt;
            &lt;ref bean=&quot;student1&quot;/&gt;
        &lt;/constructor-arg&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainclassjava-1">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_5_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:applicationCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        StudentInfo studentInfo = ctx.getBean(&quot;studentInfo&quot;, StudentInfo.class);
        studentInfo.getStudentInfo();//student1 호출

        Student student2 = ctx.getBean(&quot;student2&quot;,Student.class);
        //student1는 studentInfo으로 받음
        studentInfo.setStudent(student2);//student2 세팅
        studentInfo.getStudentInfo();

        ctx.close();//자원 반납
    }
}</code></pre>
<h2 id="di-사용에-따른-장점">DI 사용에 따른 장점</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/92385e22-4c18-400f-8acf-bd74e47eddab/image.png" alt=""></p>
<p>pencil이라는 인터페이스를 사용하여 각각 클래스에서 상속받아 사용가능함. </p>
<p>의존관계를 인터페이스로 추상화하여 다양한 의존 관계를 맺을 수 있음</p>
<h3 id="예제-3">예제 3</h3>
<h4 id="penciljavainterface">Pencil.java(Interface)</h4>
<pre><code class="language-java">package com.javalec.spring_5_2;

public interface Pencil {
    public void use();
}</code></pre>
<h4 id="pencil4b">Pencil4B</h4>
<pre><code class="language-java">package com.javalec.spring_5_2;

public class Pencil4B implements Pencil {

    @Override
    public void use() {
        System.out.println(&quot;4B 입니다.&quot;);
    }
}</code></pre>
<h4 id="pencil6b">Pencil6B</h4>
<pre><code class="language-java">package com.javalec.spring_5_2;

public class Pencil6B implements Pencil{

    @Override
    public void use() {
        System.out.println(&quot;6B 입니다.&quot;);
        }

}</code></pre>
<h4 id="pencil6bwitheraser">Pencil6BWithEraser</h4>
<pre><code class="language-java">package com.javalec.spring_5_2;

public class Pencil6BWithEraser implements Pencil{

    @Override
    public void use() {
        System.out.println(&quot;6B이고,지우개가 있습니다.&quot;);
        }
}</code></pre>
<h4 id="applicationctxxml-1">applicationCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;pencil&quot; class=&quot;com.javalec.spring_5_2.Pencil6BWithEraser&quot;&gt;&lt;/bean&gt;
    &lt;bean id=&quot;pencil2&quot; class=&quot;com.javalec.spring_5_2.Pencil6B&quot;&gt;&lt;/bean&gt;
    &lt;bean id=&quot;pencil3&quot; class=&quot;com.javalec.spring_5_2.Pencil4B&quot;&gt;&lt;/bean&gt;


&lt;/beans&gt;</code></pre>
<h4 id="mainclassjava-2">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_5_2;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(&quot;classpath:applicationCTX.xml&quot;);
        Pencil pencil = ctx.getBean(&quot;pencil&quot;,Pencil.class);
//        Pencil pencil = ctx.getBean(&quot;pencil2&quot;,Pencil.class);
//        Pencil pencil = ctx.getBean(&quot;pencil3&quot;,Pencil.class);
        pencil.use();

        Pencil pencil2 = ctx.getBean(&quot;pencil2&quot;,Pencil.class);
        pencil2.use();

        Pencil pencil3 = ctx.getBean(&quot;pencil3&quot;,Pencil.class);
        pencil3.use();

        ctx.close();
    }
}
}</code></pre>
<h3 id="예제-4">예제 4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/308cbcda-75f8-4e40-b6d9-ed00cf098aa0/image.png" alt=""></p>
<h4 id="circlejava">Circle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_5_1;

public class Circle {
    private int radius;
    public Circle(int radius) {
        super();
        this.radius = radius;
    }


    public double process() {
        return 3.14*radius*radius;
    }

    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }


}</code></pre>
<h4 id="circleinfojava">CircleInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_5_1;

public class CircleInfo {
    private Circle circle;

    public void setCircle(Circle circle) {
        this.circle = circle;
    }

    public CircleInfo(Circle circle) {
        this.circle = circle;
    }

    public void getCircleInfo() {
        if (circle != null) {
            System.out.println(&quot;반지름:&quot;+circle.getRadius());    
            System.out.println(&quot;원의 면적은: &quot;+circle.process());    
        }
    }


}</code></pre>
<h4 id="circlectxxml">circleCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;circle1&quot; class=&quot;com.javalec.spring_ex_5_1.Circle&quot;&gt;
        &lt;constructor-arg&gt;
            &lt;value&gt;10&lt;/value&gt;
        &lt;/constructor-arg&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;circle2&quot; class=&quot;com.javalec.spring_ex_5_1.Circle&quot;&gt;
        &lt;constructor-arg&gt;
            &lt;value&gt;5&lt;/value&gt;
        &lt;/constructor-arg&gt;
    &lt;/bean&gt;

    &lt;bean id=&quot;circleInfo&quot; class=&quot;com.javalec.spring_ex_5_1.CircleInfo&quot;&gt;
        &lt;constructor-arg&gt;
            &lt;ref bean=&quot;circle1&quot;/&gt;
        &lt;/constructor-arg&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainclassjava-3">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_5_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:circleCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        CircleInfo circleInfo = ctx.getBean(&quot;circleInfo&quot;,CircleInfo.class);
        circleInfo.getCircleInfo();//circle1의 정보 가지고 옴.

        Circle circle2 = ctx.getBean(&quot;circle2&quot;,Circle.class);
        circleInfo.setCircle(circle2);
        circleInfo.getCircleInfo();

        ctx.close();

    }
}</code></pre>
<hr>
<h1 id="char-6-di설정-방법">Char 6. DI설정 방법</h1>
<h2 id="xml-파일을-이용한-di-설정-방법">XML 파일을 이용한 DI 설정 방법</h2>
<p>1.xml을 이용하여 설정(기존 방식)
<img src="https://velog.velcdn.com/images/sofia_777/post/f040aac4-8e0c-46b9-a795-9c25a06cb1c7/image.png" alt=""></p>
<ol start="2">
<li>두개의 bean.xml 생성하여 가지고 오는 방법</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/4b83b255-a395-4def-af16-678c545be15e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/e2859e0e-4d4d-46a2-9dc4-18a09b0323ce/image.png" alt=""></p>
<ol start="3">
<li><code>xmlns:c=&quot;http://www.springframework.org/schema/c&quot;</code>
<code>xmlns:p=&quot;http://www.springframework.org/schema/p&quot;</code>를 사용하는 방법
c : 생성자(constructor)
p : 성분, 필드(property)
<img src="https://velog.velcdn.com/images/sofia_777/post/66b6aa73-0beb-48f4-a697-26ec591b47bb/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/c15c6cf6-5426-4938-9ff8-a2af0b593ef9/image.png" alt=""></li>
</ol>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7a2c855b-7c14-47b5-b21b-374a0864707d/image.png" alt=""></p>
<h3 id="예제-5-1">예제 5</h3>
<h4 id="studentjava-1">Student.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_1;

import java.util.ArrayList;

public class Student {
    private String name;
    private int age;
    private ArrayList&lt;String&gt; hobbys;
    private double height;
    private double weight;

    public Student(String name, int age, ArrayList&lt;String&gt; hobbys) {
        super();
        this.name = name;
        this.age = age;
        this.hobbys = hobbys;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public ArrayList&lt;String&gt; getHobbys() {
        return hobbys;
    }
    public void setHobbys(ArrayList&lt;String&gt; hobbys) {
        this.hobbys = hobbys;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
}</code></pre>
<h4 id="studentinfojava-1">StudentInfo.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_1;

public class StudentInfo {
    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }


}</code></pre>
<h4 id="familyjava">Family.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_1;

public class Family {
    String papaName;
    String mamiName;
    String sisterName;
    String brotherName;



    public Family(String papaName, String mamiName) {
        super();
        this.papaName = papaName;
        this.mamiName = mamiName;
    }



    public String getPapaName() {
        return papaName;
    }
    public void setPapaName(String papaName) {
        this.papaName = papaName;
    }
    public String getMamiName() {
        return mamiName;
    }
    public void setMamiName(String mamiName) {
        this.mamiName = mamiName;
    }
    public String getSisterName() {
        return sisterName;
    }
    public void setSisterName(String sisterName) {
        this.sisterName = sisterName;
    }
    public String getBrotherName() {
        return brotherName;
    }
    public void setBrotherName(String brotherName) {
        this.brotherName = brotherName;
    }

}</code></pre>
<h4 id="applicationctxxml-2">applicationCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;student1&quot; class=&quot;com.javalec.spring_6_1.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길동&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;10&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg&gt;
            &lt;list&gt;
                &lt;value&gt;수영&lt;/value&gt;
                &lt;value&gt;요리&lt;/value&gt;
            &lt;/list&gt;
        &lt;/constructor-arg&gt;
        &lt;property name=&quot;height&quot;&gt;
            &lt;value&gt;187&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;weight&quot;&gt;
            &lt;value&gt;84&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
&lt;!-- 안에 매개변수 (생성자) 넣지 않으면 오류 발생함 --&gt;

    &lt;bean id=&quot;studentInfo1&quot; class=&quot;com.javalec.spring_6_1.StudentInfo&quot;&gt;
        &lt;property name=&quot;student&quot;&gt;
            &lt;ref bean=&quot;student1&quot;/&gt;
        &lt;/property&gt;
    &lt;/bean&gt;


&lt;/beans&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/3bca7361-dbd6-475f-9d8a-ea7f87fdf017/image.png" alt=""></p>
<h4 id="applicationctx1xml">applicationCTX1.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:c=&quot;http://www.springframework.org/schema/c&quot;
    xmlns:p=&quot;http://www.springframework.org/schema/p&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;student3&quot; class=&quot;com.javalec.spring_6_1.Student&quot;&gt;
        &lt;constructor-arg value=&quot;홍길자&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg value=&quot;8&quot;&gt;&lt;/constructor-arg&gt;
        &lt;constructor-arg&gt;
            &lt;list&gt;
                &lt;value&gt;줄넘기&lt;/value&gt;
                &lt;value&gt;공기놀이&lt;/value&gt;
            &lt;/list&gt;    
        &lt;/constructor-arg&gt;
        &lt;property name=&quot;height&quot;&gt;
            &lt;value&gt;126&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name=&quot;weight&quot;&gt;
            &lt;value&gt;21&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;!-- &lt;bean&gt;&lt;/bean&gt; 안에 매개변수 (생성자) 넣지 않으면 오류 발생함 --&gt;

    &lt;bean id=&quot;family&quot; class=&quot;com.javalec.spring_6_1.Family&quot; c:papaName=&quot;홍아빠&quot; c:mamiName=&quot;홍엄마&quot; p:sisterName=&quot;홍누나&quot;&gt;
        &lt;property name=&quot;brotherName&quot; value=&quot;홍오빠&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;!-- p:와 property는 동일함. c:와 constructor와 동일함.  --&gt;    

&lt;/beans&gt;</code></pre>
<h4 id="mainclassjava-4">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String configLoc1 = &quot;classpath:applicationCTX.xml&quot;;

        // 추가된 부분1//
        String configLoc2 = &quot;classpath:applicationCTX1.xml&quot;;

//        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1);
        //변경된 부분 1//
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1,configLoc2);

        // 추가 및 변경된 부분1 끝//


        Student student1 =    ctx.getBean(&quot;student1&quot;, Student.class);
        System.out.println(student1.getName());
        System.out.println(student1.getHobbys());

        StudentInfo studentInfo = ctx.getBean(&quot;studentInfo1&quot;,StudentInfo.class);
        Student student2 = studentInfo.getStudent();
        System.out.println(student2.getName());
        System.out.println(student2.getHobbys());


        if (student1.equals(student2)) {
            System.out.println(&quot;student1 == student2 &quot;);
        } else {
            System.out.println(&quot;student1 != student2 &quot;);
        }


        //추가된 부분1 // 
        Student student3 = ctx.getBean(&quot;student3&quot;,Student.class);
        System.out.println(student3.getName());
        System.out.println(student3.getHobbys());

        if (student1.equals(student3)) {
            System.out.println(&quot;student1 == student3 &quot;);
        } else {
            System.out.println(&quot;student1 != student3 &quot;);
        }

        Family family = ctx.getBean(&quot;family&quot;,Family.class);
        System.out.println(family.getPapaName());
        System.out.println(family.getMamiName());
        System.out.println(family.getSisterName());
        System.out.println(family.getBrotherName());
        // 추가된 부분1 끝//
    }
}</code></pre>
<h2 id="java를-사용한-di-설정-방법">JAVA를 사용한 DI 설정 방법</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/14064c1f-369e-44da-a409-a39e9d9522e4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b2fcafaa-dccf-47cc-8646-8ff206da636c/image.png" alt="">
hobbys객체에 add()로 값을 넣고(수영, 요리)
Student에 매개변수로 hobbys를 넣고, 키와 몸무게를 세팅하여 student 객체의 값들을 모두 리턴함</p>
<h3 id="예제-5-2">예제 5</h3>
<h4 id="studentjava-2">Student.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_2;

import java.util.ArrayList;

public class Student {
    private String name;
    private int age;
    private ArrayList&lt;String&gt; hobbys;
    private double height;
    private double weight;

    public Student(String name, int age, ArrayList&lt;String&gt; hobbys) {
        super();
        this.name = name;
        this.age = age;
        this.hobbys = hobbys;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public ArrayList&lt;String&gt; getHobbys() {
        return hobbys;
    }
    public void setHobbys(ArrayList&lt;String&gt; hobbys) {
        this.hobbys = hobbys;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
}</code></pre>
<h4 id="applicationconfigjava">ApplicationConfig.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_2;

import java.util.ArrayList;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
    @Bean
    public Student student1() {
        ArrayList&lt;String&gt; hobbys = new ArrayList&lt;String&gt;();
        hobbys.add(&quot;수영&quot;);
        hobbys.add(&quot;요리&quot;);

        Student student = new Student(&quot;홍길동&quot;, 20, hobbys);
        student.setHeight(180);
        student.setWeight(80);

        return student;
    }

    @Bean
    public Student student2() {
        ArrayList&lt;String&gt; hobbys = new ArrayList&lt;String&gt;();
        hobbys.add(&quot;독서&quot;);
        hobbys.add(&quot;음악감상&quot;);

        Student student = new Student(&quot;홍길순&quot;, 18, hobbys);
        student.setHeight(170);
        student.setWeight(55);

        return student;
    }
}</code></pre>
<h4 id="cglib-추가-필요pomxml">cglib 추가 필요(pom.xml)</h4>
<pre><code class="language-java">&lt;!-- cglib --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.kenai.nbpwr&lt;/groupId&gt;
            &lt;artifactId&gt;net-sf-cglib&lt;/artifactId&gt;
            &lt;version&gt;2.1.3-201003011305&lt;/version&gt;
        &lt;/dependency&gt;</code></pre>
<h4 id="mainclassjava-5">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_6_2;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx =  new AnnotationConfigApplicationContext(ApplicationConfig.class);
        Student student1 = ctx.getBean(&quot;student1&quot;,Student.class);
        System.out.println(&quot;이름 :&quot;+student1.getName());
        System.out.println(&quot;나이 :&quot;+student1.getAge());
        System.out.println(&quot;취미 :&quot;+student1.getHobbys());
        System.out.println(&quot;신장 :&quot;+student1.getHeight());
        System.out.println(&quot;몸무게 :&quot;+student1.getWeight());

        System.out.println(&quot;========================================&quot;);


        Student student2 = ctx.getBean(&quot;student2&quot;,Student.class);
        System.out.println(&quot;이름 :&quot;+student2.getName());
        System.out.println(&quot;나이 :&quot;+student2.getAge());
        System.out.println(&quot;취미 :&quot;+student2.getHobbys());
        System.out.println(&quot;신장 :&quot;+student2.getHeight());
        System.out.println(&quot;몸무게 :&quot;+student2.getWeight());

    }
}</code></pre>
<h1 id="reference">reference</h1>
<ul>
<li><a href="https://steady-coding.tistory.com/459">https://steady-coding.tistory.com/459</a></li>
<li><a href="https://velog.io/@dldmswjd322/DI%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90">https://velog.io/@dldmswjd322/DI%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.09.30 Spring ]]></title>
            <link>https://velog.io/@sofia_777/2022.09.30-Spring</link>
            <guid>https://velog.io/@sofia_777/2022.09.30-Spring</guid>
            <pubDate>Tue, 11 Oct 2022 17:05:14 GMT</pubDate>
            <description><![CDATA[<p>스프링 파일 강사님이 다시 배포한 것으로 사용(기존의 것 오류발생)</p>
<p> Spring tool suit 3 사용
 → 내장된 톰캣 존재함</p>
<hr>
<p> 사용할 파일은 Spring Legacy Project</p>
<h1 id="chap-1-spring이란">chap 1. Spring이란?</h1>
<h2 id="프레임워크">프레임워크</h2>
<ul>
<li>프론트 엔드 <ul>
<li>AngularJS, React, Bootstrap, Vue.js, etc(Node.js, Nexacro[MiPlatform, XPlatform], WebSquare)<ul>
<li>백엔드 </li>
</ul>
</li>
<li>Structs, Spring, Spring Boot, 전자정부, etc(Laf/J, DevOn)</li>
<li>스프링 부트를 사용해도 됨.(설정이나 가르치기 쉬움)</li>
<li>JSP-&gt;Structs-&gt;Spring 순으로 발전</li>
</ul>
</li>
</ul>
<h2 id="spring-web-project-2가지">Spring web project 2가지</h2>
<ol>
<li>Spring Starter Project : Spring Boot 이용</li>
</ol>
<ul>
<li>개발자가 복잡한 설정 없이 모든 개발 환경이 준비되기 때문에 초보 개발자도 쉽게 웹 프로젝트를 만들 수 있다.<ul>
<li>Embed Tomcat을 사용하기 때문에 따로 톰켓을 설치하거나 매번 버전 관리를 하지 않아도 된다.</li>
<li>dependency 자동화</li>
<li>XML 설정을 하지 않아도 된다.</li>
</ul>
</li>
</ul>
<ol start="2">
<li>Spring Legacy Project : JDBC 템플릿을 이용<ul>
<li>조금 복잡 하기는 하나 실제 개발 업무에서 많이 사용하는 방식이다.
(전자정부 프레임워크로 넘어가기 편하기 때문)</li>
</ul>
</li>
</ol>
<h2 id="spring에서-사용될-언어-및-지식들">Spring에서 사용될 언어 및 지식들</h2>
<ul>
<li>JAVA 언어 기반</li>
<li>JAVA언어 및 JSP&amp;Servlet 선행학습</li>
<li>HTML,CSS,JS,jQuery 등 스크립트 언어</li>
</ul>
<hr>
<h1 id="chap-2-spring-project-생성">chap 2. Spring Project 생성</h1>
<h2 id="didependency-injection-의존성-주입">DI(Dependency Injection) 의존성 주입</h2>
<p>스프링의 주요 특징 중 하나로 여기서는 객체간의 의존을 의미함</p>
<ul>
<li>의존 : 변경에 의해 영향을 받는 관계</li>
</ul>
<p>DI는 의존하는 객체를 직접 생성하는 대신 의존객체를 전달 받는 방식으로 외부에서 객체를 생성하여 주입함</p>
<p>⇒ 각 객체간의 의존성을 스프링 컨테이너가 자동으로 연결해주는 것으로 Bean 설정 파일에 의존관계가 필요한 정보를 추가하면 스프링 컨테이너가 자동적으로 연결함.</p>
<ul>
<li>두가지 방법으로 존재</li>
</ul>
<ol>
<li><p>. 으로 접근 하는 방법</p>
</li>
<li><p>setter()나 construct()로 접근 하는 방법
<img src="https://velog.velcdn.com/images/sofia_777/post/fe3df795-c169-4e4c-881b-a4ec0cd7c419/image.png" alt=""></p>
<p>두 가지 방법 다 B와 C는 A객체에 의존적</p>
<p>모듈 간의 결합도가 낮아지고 유연성이 높아짐</p>
</li>
</ol>
<h2 id="ioc-inversion-of-control-제어의-역전">IOC (Inversion of Control) 제어의 역전</h2>
<ul>
<li><p>메소드나 객체의 호출 작업을 개발자가 결정하는것이 아니라 외부에서 결정되는 것
제어의 흐름을 바꿈</p>
</li>
<li><p>의존성을 역전 시켜 객체간의 결합도를 줄이고 유연한 코드 작성가능. 유지보수 편해짐 
<img src="https://velog.velcdn.com/images/sofia_777/post/1aecd717-0294-47b3-ab51-ee7b88819f0a/image.png" alt=""></p>
</li>
</ul>
<p>여기서 IOC 컨테이너는 객체가 담겨있는 컨테이너이며, A에서 IOC컨테이너 속의 객체들을 제어 할 수있음(역전 발생)</p>
<h2 id="maven빌드관리-도구">Maven(빌드관리 도구)</h2>
<ul>
<li>프로젝트에서 작성한 java 코드와 프로젝트 내에 필요한 각종 xml, properties, jar 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징해주는 빌드 과정을 &quot;빌드 자동화 도구&quot; 라고 보면 된다.</li>
<li>즉, 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램이라고 할 수 있다.</li>
<li>애플리케이션을 개발하면서, 일반적으로 개발에 필요한 다양한 외부 라이브러리들을 다운로드 하고, 해당 라이브러리를 사용하여 개발해야하는 상황이 많은데 그 때마다 라이브러리들을 번거롭게 모두 다운 받을 필요 없이 빌드 도구 설정 파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하여 필요한 라이브러리들을 설정 파일을 통해 자동으로 다운로드 해주고 이를 간편히 관리해 주는 도구</li>
</ul>
<hr>
<h3 id="예제-1">예제 1</h3>
<ol>
<li><p>Spring Legacy project 생성
<img src="https://velog.velcdn.com/images/sofia_777/post/a770c142-5341-42ee-a701-8bb5aad6a3a4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/01959616-47a4-4aee-98cc-c776824e9bf6/image.png" alt=""></p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/6fc295eb-fd61-4d81-8174-7e51d6250cbb/image.png" alt=""></p>
<h4 id="calculationjava">Calculation.java</h4>
<pre><code class="language-java">package com.javalec.spring_2_1;

public class Calculation {
    private int firstNum;
    private int SecondNum;

    public void add() {
        System.out.println(&quot;add&quot;);
        System.out.println(firstNum+&quot;+&quot;+SecondNum+&quot;=&quot;+(firstNum+SecondNum));
    }

    public void sub() {
        System.out.println(&quot;sub&quot;);
        System.out.println(firstNum+&quot;-&quot;+SecondNum+&quot;=&quot;+(firstNum-SecondNum));
    }

    public void mul() {
        System.out.println(&quot;mul&quot;);
        System.out.println(firstNum+&quot;*&quot;+SecondNum+&quot;=&quot;+(firstNum*SecondNum));
    }

    public void div() {
        System.out.println(&quot;div&quot;);
        System.out.println(firstNum+&quot;/&quot;+SecondNum+&quot;=&quot;+(firstNum/SecondNum));
    }

    public int getFirstNum() {
        return firstNum;
    }
    public void setFirstNum(int firstNum) {
        this.firstNum = firstNum;
    }
    public int getSecondNum() {
        return SecondNum;
    }
    public void setSecondNum(int secondNum) {
        SecondNum = secondNum;
    }

}</code></pre>
<h4 id="mainclassjava">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_2_1;

public class MainClass {
    public static void main(String[] args) {
        Calculation calculation = new Calculation();
        calculation.setFirstNum(10);
        calculation.setSecondNum(2);

        calculation.add();
        calculation.sub();
        calculation.mul();
        calculation.div();
    }
}</code></pre>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/2c8d3290-0b3e-4519-a470-a64ad3c4f6f0/image.png" alt=""></p>
<p>** calculation객체가 MainClass에 의존적이다.  ⇒ IoC(Inversion of Control, 제어의 역전)** </p>
<h3 id="예제-2">예제 2</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/2ef4e53a-1e40-4ec1-924d-c55e5b7c0ff8/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/abc18493-55ec-4989-afc7-3bd422f97dd5/image.png" alt=""></p>
<h4 id="circlejava">Circle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_1;

public class Circle {
    private int radius;



    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    public void Circle_area() {
        System.out.println(&quot;원의 면적은 &quot;+radius*radius*3.14);
    }
}</code></pre>
<h4 id="rectangeljava">Rectangel.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_1;

public class Rectangel {
    private int width;
    private int height;



    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void Rectangel_area() {
        System.out.println(&quot;사각형의 면적은 &quot;+ (width*height));
    }

}</code></pre>
<h4 id="drawjava">Draw.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_1;

public class Draw {
    public static void main(String[] args) {
        Circle circle = new Circle();
        Rectangel rectangel = new Rectangel();

        circle.setRadius(10);
        rectangel.setWidth(20);
        rectangel.setHeight(30);


        circle.Circle_area();
        rectangel.Rectangel_area();
    }
}</code></pre>
<h3 id="예제3">예제3</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/ca4a1eb6-e5b7-4b19-a3a0-0b2021638ee2/image.png" alt=""></p>
<h4 id="seasonjava">Season.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_2_2;

public class Season {
    private int month;

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public void Season_if() {
//        if (2&lt;month &amp;&amp; month&lt;6) {
//            System.out.println(&quot;봄&quot;);
//        }else if (5&lt;month &amp;&amp; month&lt;9) {
//            System.out.println(&quot;여름&quot;);            
//        }else if (8&lt;month &amp;&amp; month&lt;12) {
//            System.out.println(&quot;가을&quot;);            
//        }else if(month&lt;3 || month==12 ) {
//            System.out.println(&quot;겨울&quot;);
//        }
//    
//        
        switch (month) {
        case 3:
        case 4:
        case 5:
            System.out.println(&quot;봄&quot;);
            break;
        case 6:
        case 7:
        case 8:
            System.out.println(&quot;여름&quot;);
            break;
        case 9:
        case 10:
        case 11:
            System.out.println(&quot;가을&quot;);
            break;
        case 12:
        case 1:
        case 2:
            System.out.println(&quot;겨울&quot;);
            break;

        default:
            break;
        }
    }
}</code></pre>
<h4 id="won2dollarjava">Won2dollar.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_2_2;

public class Won2dollar {
    private int won;

    public int getWon() {
        return won;
    }

    public void setWon(int won) {
        this.won = won;
    }

    public void process() {
        System.out.println(&quot;$&quot;+won/1200.0);
    }
}</code></pre>
<h4 id="seasondallarjava">SeasonDallar.java</h4>
<pre><code class="language-java">package com.javajavalecelc.spring_ex_2_2;

public class SeasonDallar {
    public static void main(String[] args) {

        Season season = new Season();
        Won2dollar won2dollar = new Won2dollar();

        season.setMonth(9);
        season.Season_if();

        won2dollar.setWon(3300);
        won2dollar.process();
    }
}</code></pre>
<h3 id="예제-4">예제 4</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/6ea515df-8152-4a78-bb2b-994f613b94ff/image.png" alt=""></p>
<h4 id="threejava">Three.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_3;

public class Three {
    private int three;


    public int getThree() {
        return three;
    }

    public void setThree(int three) {
        this.three = three;
    }

    public void process() {
        if (three%3 ==0) {
            System.out.println(&quot;3의 배수입니다.&quot;);
        }else {
            System.out.println(&quot;3의 배수가 아닙니다.&quot;);
        }
    }
}</code></pre>
<h4 id="divandremainsjava">DivAndRemains.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_3;

public class DivAndRemains {
    private int Num;

    public int getNum() {
        return Num;
    }

    public void setNum(int num) {
        Num = num;
    }

    public void process() {
        int ten =Num/10;
        int one =Num%10;

        if (ten == one) {
            System.out.println(&quot;10의 자리와 1의 자리가 같습니다.&quot;);
        }else {
            System.out.println(&quot;10의 자리와 1의 자리가 다릅니다.&quot;);
        }
    }
}</code></pre>
<h4 id="threedivandremainsjava">ThreeDivAndRemains.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_3;

public class ThreeDivAndRemains {
    public static void main(String[] args) {
        Three three = new Three();
        DivAndRemains divandremains = new DivAndRemains();

        three.setThree(129);
        three.process();

        divandremains.setNum(77);
        divandremains.process();
    }
}</code></pre>
<h3 id="예제-5">예제 5</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/c3518442-6bc4-4b59-b3aa-9efa8ecebdcd/image.png" alt=""></p>
<h4 id="rectanglejava">Rectangle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_4;

public class Rectangle {
    private int x;
    private int y;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }


    public void process() {
        if ((100&lt;= x &amp;&amp; x&lt;=200) &amp;&amp; (100&lt;= y &amp;&amp; y&lt;=200)) {
            System.out.println(&quot;(&quot;+x+&quot;,&quot;+y+&quot;)는 사각형 안에 있습니다.&quot;);
        }else {
            System.out.println(&quot;(&quot;+x+&quot;,&quot;+y+&quot;)는 사각형 안에 없습니다.&quot;);
        }
    }

}</code></pre>
<h4 id="medianjava">Median.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_4;

public class Median {
    private int a;
    private int b;
    private int c;
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }
    public int getC() {
        return c;
    }
    public void setC(int c) {
        this.c = c;
    }

    public void process() {
        if ( (b&lt;a &amp;&amp; a&lt;c)|| (c&lt;a &amp;&amp; a&lt;b)) {
            System.out.println(&quot;입력된 정수가 &quot;+a+&quot;와 &quot;+b+&quot;와 &quot;+c+&quot;의 중간값은 &quot;+a);
        }else if ((a&lt;b &amp;&amp; b&lt;c)|| (c&lt;b &amp;&amp; b&lt;a)) {
            System.out.println(&quot;입력된 정수가 &quot;+a+&quot;와 &quot;+b+&quot;와 &quot;+c+&quot;의 중간값은 &quot;+b);
        }else {
            System.out.println(&quot;입력된 정수가 &quot;+a+&quot;와 &quot;+b+&quot;와 &quot;+c+&quot;의 중간값은 &quot;+c);
        }
    }
}</code></pre>
<h4 id="rectanglemedianjava">RectangleMedian.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_4;

public class RectangleMedian {
    public static void main(String[] args) {

    Rectangle rectangle = new Rectangle();
    Median median = new Median();

    rectangle.setX(150);
    rectangle.setY(150);
    rectangle.process();

    median.setA(20);
    median.setB(100);
    median.setC(33);

    median.process();
    }

}</code></pre>
<h3 id="예제-6">예제 6</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/df131705-7589-4c85-895a-86b8cdfa0ff7/image.png" alt=""></p>
<h4 id="multiplejava">Multiple.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_5;

public class Multiple {
    private int Num;


    public int getNum() {
        return Num;
    }

    public void setNum(int num) {
        Num = num;
    }

    public void process() {
        boolean multiple = false;
        if (Num%3 == 0) {
            System.out.println(&quot;3의 배수이다.&quot;);
            multiple=true;
        }
        if (Num%5 ==0) {
            System.out.println(&quot;5의 배수이다.&quot;);
            multiple=true;
        }
        if (Num%8 ==0) {
            System.out.println(&quot;8의 배수이다.&quot;);
            multiple=true;
        }

        if (!multiple) {
            System.out.println(&quot;어느 배수도 아니다.&quot;);
        }
    }
}</code></pre>
<h4 id="trianglejava">Triangle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_5;

public class Triangle {
    private int Num1;
    private int Num2;
    private int Num3;
    public int getNum1() {
        return Num1;
    }
    public void setNum1(int num1) {
        Num1 = num1;
    }
    public int getNum2() {
        return Num2;
    }
    public void setNum2(int num2) {
        Num2 = num2;
    }
    public int getNum3() {
        return Num3;
    }
    public void setNum3(int num3) {
        Num3 = num3;
    }


    public void process() {
        if (Num1+Num2&lt;=Num3 || Num1+Num3&lt;=Num2||Num2+Num3&lt;=Num1) {
            System.out.println(&quot;삼각형이 되지 않습니다.&quot;);
        }else {
            System.out.println(&quot;삼각형이 됩니다.&quot;);
        }
    }

}</code></pre>
<h4 id="multipletrianglejava">MultipleTriangle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_5;

public class MultipleTriangle {
    public static void main(String[] args) {

    Multiple mul = new Multiple();

    Triangle tri = new Triangle();

    mul.setNum(240);
    mul.process();


    tri.setNum1(4);
    tri.setNum2(3);
    tri.setNum3(5);
    tri.process();
    }
}</code></pre>
<h3 id="예제-8">예제 8</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/1857fc53-cf3f-45db-8305-016e88aa3af7/image.png" alt=""></p>
<h4 id="asteriskjava">Asterisk.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_6;

public class Asterisk {
    private int n;

    public int getN() {
        return n;
    }

    public void setN(int n) {
        this.n = n;
    }


    public void process() {
        StringBuffer strBuf = new StringBuffer();

        for (int i = n; i &gt;0; i--) { // n만큼 반복

            for (int j = 0; j &lt; i; j++) {// j가 i(n)만큼 반복
                strBuf.append(&#39;*&#39;);
            }
            strBuf.append(&quot;\n&quot;);
        }
        System.out.println(strBuf.toString());
    }
}</code></pre>
<h4 id="capitaljava">Capital.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_6;

public class Capital {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public void process() {
        StringBuffer strBuf = new StringBuffer();

        char c =&#39;A&#39;;
        char c2 = str.charAt(0);

        for (char i = c2; i &gt;= c; i--) {
            for (char j = c; j &lt;= i; j++) {
                strBuf.append(j);
            }
            strBuf.append(&quot;\n&quot;);
        }
        System.out.println(strBuf.toString());
    }


}</code></pre>
<h4 id="asteriskcapitaljava">AsteriskCapital.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex2_6;

public class AsteriskCapital {
    public static void main(String[] args) {
        Asterisk asterisk = new Asterisk();
        asterisk.setN(5);
        asterisk.process();


        Capital capital = new Capital();
        capital.setStr(&quot;F&quot;);
        capital.process();
    }
}</code></pre>
<h1 id="chap3-di---1">chap3. DI - 1</h1>
<h2 id="스프링을-이용한-객체-생성과-조립">스프링을 이용한 객체 생성과 조립</h2>
<ol>
<li><p>스프링을 사용하지 않은 프로젝트의 경우 
<img src="https://velog.velcdn.com/images/sofia_777/post/810783a7-1d3a-48d8-bb4b-1f28b41a937b/image.png" alt=""></p>
</li>
<li><p>스프링을 사용한 프로젝트의 경우 
<img src="https://velog.velcdn.com/images/sofia_777/post/68de40d5-1b7f-489c-9b9a-583f7ba17ebf/image.png" alt=""></p>
</li>
</ol>
<h2 id="스프링-코드-설명들">스프링 코드 설명들</h2>
<ol>
<li><p>String configLoc = &quot;classpath:applicationCTX.xml&quot;;
: 스프링 XML(객체 정보가 들어있음) 객체 정보를 받기 위해서 속성으로 classpath를 받는다.(환경 위치)</p>
</li>
<li><p>AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc);
:클래스의 매개변수로 받음(configLoc) → 객체 정보를 해석 → ctx로 담음</p>
</li>
<li><p>MyCalculator myCalculator = ctx.getBean(&quot;myCalculator&quot;, MyCalculator.class);
: getBean 메소드를 사용함.MyCalculator.class를 참조 변수로 사용</p>
</li>
</ol>
<h2 id="스프링-설정-파일의-이해">스프링 설정 파일의 이해</h2>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/351889e1-b76b-4eb3-a715-d31985a2df0e/image.png" alt=""></p>
<pre><code class="language-java"> &lt;bean id=&quot;calculator&quot; class=&quot;com.javalec.ex.Calculator&quot;/&gt;
&lt;bean id=&quot;myCalculator&quot; class=&quot;com.javalec.ex.MyCalculator&quot;&gt;

    &lt;property name=&quot;calculator&quot;&gt;
        &lt;ref bean=&quot;calculator&quot;/&gt;
    &lt;/property&gt;

    &lt;property name=&quot;firstNum&quot; value=&quot;10&quot;/&gt;
    &lt;property name=&quot;secondNum&quot; value=&quot;2&quot;/&gt;
&lt;/bean&gt;</code></pre>
<hr>
<h3 id="예제-1-1">예제 1.</h3>
<p> 지금까지 한 방식대로 만들면</p>
<h4 id="calculatorjava">Calculator.java</h4>
<pre><code class="language-java">package com.javalec.spring_3_1;

public class Calculator {
    public void addition(int f, int s) {
        System.out.println(&quot;addition()&quot;);
        int result = f+s;

        System.out.println(f+&quot;+&quot;+s+&quot;=&quot;+result);
    }

    public void subtraction(int f, int s) {
        System.out.println(&quot;subtraction()&quot;);
        int result = f-s;

        System.out.println(f+&quot;-&quot;+s+&quot;=&quot;+result);
    }

    public void multplication(int f, int s) {
        System.out.println(&quot;multplication()&quot;);
        int result = f*s;

        System.out.println(f+&quot;*&quot;+s+&quot;=&quot;+result);
    }

    public void division(int f, int s) {
        System.out.println(&quot;division()&quot;);
        int result = f/s;

        System.out.println(f+&quot;/&quot;+s+&quot;=&quot;+result);
    }
}</code></pre>
<h4 id="mycalculatorjava">MyCalculator.java</h4>
<pre><code class="language-java">package com.javalec.spring_3_1;

public class MyCalculator {
    private Calculator calculator;

    private int firstNum;
    private int secondNum;

    public void add() {
        calculator.addition(firstNum, secondNum);
    }

    public void sub() {
        calculator.subtraction(firstNum, secondNum);
    }

    public void mul() {
        calculator.multplication(firstNum, secondNum);
    }

    public void div() {
        calculator.division(firstNum, secondNum);
    }



    public Calculator getCalculator() {
        return calculator;
    }
    public void setCalculator(Calculator calculator) {
        this.calculator = calculator;
    }
    public int getFirstNum() {
        return firstNum;
    }
    public void setFirstNum(int firstNum) {
        this.firstNum = firstNum;
    }
    public int getSecondNum() {
        return secondNum;
    }
    public void setSecondNum(int secondNum) {
        this.secondNum = secondNum;
    }

}</code></pre>
<h4 id="mainclassjava-1">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_3_1;

public class MainClass {
    public static void main(String[] args) {
        MyCalculator myCalculator = new MyCalculator();
        myCalculator.setCalculator(new Calculator());


        myCalculator.setFirstNum(10);
        myCalculator.setSecondNum(2);

        myCalculator.add();
        myCalculator.sub();
        myCalculator.mul();
        myCalculator.div();


    }
}</code></pre>
<p>객체 정보를 담고있는 CTX.xml 파일을 생성하여 출력 하는 방법</p>
<h4 id="applicationctxxml">applicationCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;!-- calculator Bean 객체 생성 --&gt;
    &lt;bean id=&quot;calculator&quot; class=&quot;com.javalec.spring_3_2.Calculator&quot;&gt;&lt;/bean&gt;


    &lt;bean id=&quot;myCalculator&quot; class=&quot;com.javalec.spring_3_2.MyCalculator&quot;&gt;
        &lt;property name=&quot;calculator&quot;&gt; 
        &lt;!--  calculator는  private Calculator calculator;의 calculator를 말함. --&gt;
            &lt;ref bean=&quot;calculator&quot;/&gt; 
            &lt;!-- 여기서 말하는 bean=&quot;calculator&quot; =&gt; 7번째 줄의  id=&quot;calculator&quot; --&gt;
        &lt;/property&gt;
        &lt;property name=&quot;firstNum&quot; value=&quot;10&quot;&gt;&lt;/property&gt; &lt;!-- property로 name과 value 세팅 --&gt;
        &lt;property name=&quot;secondNum&quot; value=&quot;2&quot;&gt;&lt;/property&gt;
        &lt;!-- 참조변수를 따라감.  --&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<h4 id="mainclassjava-2">MainClass.java</h4>
<pre><code class="language-java">package com.javalec.spring_3_2;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
//        MyCalculator myCalculator = new MyCalculator();
//        myCalculator.setCalculator(new Calculator());
//        
//        myCalculator.setFirstNum(10);
//        myCalculator.setSecondNum(2);


        String configLoc =  &quot;classpath:applicationCTX.xml&quot;;//매개변수로 해서 
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);//업캐스팅 발생
        MyCalculator myCalculator2 = ctx.getBean(&quot;myCalculator&quot;, MyCalculator.class);
//        &lt;bean id=&quot;myCalculator&quot; class=&quot;com.javalec.spring_3_2.MyCalculator&quot;&gt;의 myCalculator가 들어감(참조변수로)
//        위치 어디인지 몰라 헤맬것 같아서 적어놓음 ctx.getBean(&quot;myCalculator&quot;, MyCalculator.class)의 &quot;myCalculator&quot;를 말하는 거임!!!!!
//        applicationCTX.xml 의 10~19까지의 객체 정보를 가지고 옴

//        만약에  MyCalculator myCalculator2 = ctx.getBean(&quot;myCalculator&quot;, MyCalculator.class);의
//        &quot;myCalculator&quot;를 &quot;myCalculator2&quot; 로 바꾸면 오류가 발생함. &quot;myCalculator2&quot;로 하고싶으면
//        &lt;bean id=&quot;myCalculator&quot; class=&quot;com.javalec.spring_3_2.MyCalculator&quot;&gt;의 id=&quot;myCalculator&quot;를
//        id=&quot;myCalculator2&quot; 로 바꿔야함

        myCalculator2.add();
        myCalculator2.sub();
        myCalculator2.mul();
        myCalculator2.div();


    }
}</code></pre>
<h3 id="예제-2-1">예제 2</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/c676fba6-11cc-4f34-9c24-37032e1beb4f/image.png" alt=""></p>
<h4 id="circlejava-1">circle.java</h4>
<pre><code class="language-java">
package com.javalec.spring_ex_3_1;

public class Circle {
    public void area(int radius) {
        System.out.println(&quot;원의 면적은 &quot;+(3.14*radius*radius));
    }
}</code></pre>
<h4 id="mycirclejava">MyCircle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_1;

public class MyCircle {
    private Circle circle;

    private int radius;

    public void ar() {
        circle.area(radius);
    }



    public Circle getCircle() {
        return circle;
    }

    public void setCircle(Circle circle) {
        this.circle = circle;
    }

    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }


}</code></pre>
<h4 id="circlectxxml">circleCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;!-- Circle Bean 객체 생성 --&gt;
    &lt;bean id=&quot;circle&quot; class=&quot;com.javalec.spring_ex_3_1.Circle&quot;&gt;&lt;/bean&gt;



    &lt;bean id=&quot;mycircle&quot; class=&quot;com.javalec.spring_ex_3_1.MyCircle&quot;&gt;
        &lt;property name=&quot;circle&quot;&gt;
            &lt;ref bean=&quot;circle&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;radius&quot; value=&quot;10&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="maincirclejava">MainCircle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex_3_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainCircle {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:circleCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        MyCircle myCircle = ctx.getBean(&quot;myCircle&quot;,MyCircle.class);

        myCircle.ar();
    }
}</code></pre>
<h3 id="예제-3">예제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/83ad8136-52ec-44c3-a59f-e79c992e7ee4/image.png" alt=""></p>
<h4 id="rectangle">Rectangle</h4>
<pre><code class="language-java">package com.javalec.spring_ex3_2;

public class Rectangle {
    public void area(int width, int height) {
        System.out.println(&quot;사각형의 면적은 &quot;+width*height);
    }
}</code></pre>
<h4 id="myrectangle">MyRectangle</h4>
<pre><code class="language-java">package com.javalec.spring_ex3_2;

public class MyRectangle {
    private Rectangle rectangle;
    int width;
    int height;

    public void ar() {
        rectangle.area(width, height);
    }



    public Rectangle getRectangle() {
        return rectangle;
    }
    public void setRectangle(Rectangle rectangle) {
        this.rectangle = rectangle;
    }
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
}</code></pre>
<h4 id="rectanglectxxml">rectangleCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;rectangle&quot; class=&quot;com.javalec.spring_ex3_2.Rectangle&quot;/&gt;

    &lt;bean id=&quot;myRectangle&quot; class=&quot;com.javalec.spring_ex3_2.MyRectangle&quot;&gt;
        &lt;property name=&quot;rectangle&quot;&gt;
            &lt;ref bean=&quot;rectangle&quot;/&gt;
        &lt;/property&gt;
        &lt;property name=&quot;width&quot; value=&quot;4&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;height&quot; value=&quot;6&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
<h4 id="mainrectanglejava">MainRectangle.java</h4>
<pre><code class="language-java">package com.javalec.spring_ex3_2;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainRectangle {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:rectangleCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        MyRectangle myRectangle = ctx.getBean(&quot;myRectangle&quot;,MyRectangle.class);

        myRectangle.ar();
    }
}</code></pre>
<h3 id="예제-4-1">예제 4</h3>
<p> <img src="https://velog.velcdn.com/images/sofia_777/post/f5c8a98c-3b56-4db1-bbc4-1dfe35151f5a/image.png" alt=""></p>
<h4 id="seasonjava-1">Season.java</h4>
<pre><code class="language-java">package com.javalec.spring_3_ex_3_3;

public class Season {
    public void rsltSeason(int month) {

        switch (month) {
        case 3: 
        case 4: 
        case 5: 
                System.out.print(&quot;입력된 정수가 &quot;+month+&quot;은 계절이 봄&quot;);
            break;
        case 6:
        case 7:
        case 8:
            System.out.println(&quot;입력된 정수가 &quot;+month+&quot;은 계절이 여름&quot;);

            break;

        case 9:
        case 10:
        case 11:
            System.out.println(&quot;입력된 정수가 &quot;+month+&quot;은 계절이 가을&quot;);
            break;

        case 12:
        case 1:
        case 2:
            System.out.println(&quot;입력된 정수가 &quot;+month+&quot;은 계절이 겨울&quot;);
            break;

        default:
            break;
        }
    }
}</code></pre>
<h4 id="myseasonjava">MySeason.java</h4>
<pre><code class="language-java">package com.javalec.spring_3_ex_3_3;

public class MySeason {
    private Season season;

    int month;

    public void result() {
        season.rsltSeason(month);
    }


    public Season getSeason() {
        return season;
    }

    public void setSeason(Season season) {
        this.season = season;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

}</code></pre>
<h4 id="seasonctxxml">seasonCTX.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;bean id=&quot;season&quot; class=&quot;com.javalec.spring_3_ex_3_3.Season&quot;/&gt;

    &lt;bean id=&quot;mySeason&quot; class=&quot;com.javalec.spring_3_ex_3_3.MySeason&quot;&gt;
        &lt;property name=&quot;season&quot;&gt;
            &lt;ref bean=&quot;season&quot;/&gt;    
        &lt;/property&gt;
        &lt;property name=&quot;month&quot; value=&quot;9&quot;&gt;&lt;/property&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<h4 id="mainseasonjava">MainSeason.java</h4>
<pre><code class="language-java">package com.javalec.spring_3_ex_3_3;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainSeason {
    public static void main(String[] args) {
        String configLoc = &quot;classpath:seasonCTX.xml&quot;;
        AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
        MySeason mySeason = ctx.getBean(&quot;mySeason&quot;,MySeason.class);

        mySeason.result();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.09.13~14 JSP]]></title>
            <link>https://velog.io/@sofia_777/2022.09.13-JSP</link>
            <guid>https://velog.io/@sofia_777/2022.09.13-JSP</guid>
            <pubDate>Tue, 13 Sep 2022 15:04:51 GMT</pubDate>
            <description><![CDATA[<h1 id="자료실-ppt03">자료실 PPT.03</h1>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/901332b7-fab1-4456-a7c2-4e0a26ab7ceb/image.png" alt=""></p>
<h2 id="💡기존-게시판-소스에-자료를-첨부하는-기능-추가">💡기존 게시판 소스에 자료를 첨부하는 기능 추가</h2>
<blockquote>
<ul>
<li>BoardBean.java<ul>
<li>private String b_fname;</li>
<li>private int b_fsize;<BR> </li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li>write.jsp =&gt;파일 추가<BR></li>
<li>write_ok.jsp =&gt;파일 업로드 처리<BR></li>
<li>BoardDBBean.java<ul>
<li>insertBoard() 메소드 =&gt; insert 시 파일 이름, 파일 크기 추가</li>
<li>getBoard() 메소드    =&gt; BoardBean 객체에 파일이름/크기 셋팅</li>
<li>listBoard() 메소드 =&gt; board 객체에 파일이름/크기 셋팅</li>
</ul>
</li>
<li>list.jsp =&gt; 첨부파일 추가<BR></li>
<li>show.jsp &gt; 파일 내용 표시<BR></li>
<li>delete_ok.jsp =&gt;파일 삭제<BR></li>
</ul>
<h2 id="sql">SQL</h2>
<pre><code class="language-sql">CREATE TABLE BOARDT
(B_ID NUMBER(5) PRIMARY KEY
,B_NAME VARCHAR2(20)
,B_EMAIL VARCHAR2(50)
,B_TITLE VARCHAR2(80)
,B_CONTENT VARCHAR2(3000)
,B_DATE DATE
,B_HIT NUMBER(5) DEFAULT 0
,B_PWD VARCHAR2(12)
,B_IP VARCHAR2(15)
,B_REF NUMBER(5)
,B_STEP NUMBER(5)
,B_LEVEL NUMBER(5)
,B_FNAME VARCHAR2(100)
,B_FSIZE NUMBER(10)
);</code></pre>
<h3 id="boardbeanjava">BoardBean.java</h3>
<pre><code class="language-java">package magic.board;

import java.sql.Timestamp;

public class BoardBean {
    private int b_id;
    private String b_name;
    private String b_email;
    private String b_title;
    private String b_content;
    private Timestamp b_date;
    private int b_hit;
    private String b_pwd;
    private String b_ip;
    private int b_ref;
    private int b_step;
    private int b_level;
    private String b_fname;
    private int b_fsize;


    public String getB_fname() {
        return b_fname;
    }
    public void setB_fname(String b_fname) {
        this.b_fname = b_fname;
    }
    public int getB_fsize() {
        return b_fsize;
    }
    public void setB_fsize(int b_fsize) {
        this.b_fsize = b_fsize;
    }
    public int getB_ref() {
        return b_ref;
    }
    public void setB_ref(int b_ref) {
        this.b_ref = b_ref;
    }
    public int getB_step() {
        return b_step;
    }
    public void setB_step(int b_step) {
        this.b_step = b_step;
    }
    public int getB_level() {
        return b_level;
    }
    public void setB_level(int b_level) {
        this.b_level = b_level;
    }
    public String getB_ip() {
        return b_ip;
    }
    public void setB_ip(String b_ip) {
        this.b_ip = b_ip;
    }
    public String getB_pwd() {
        return b_pwd;
    }
    public void setB_pwd(String b_pwd) {
        this.b_pwd = b_pwd;
    }
    public int getB_id() {
        return b_id;
    }
    public void setB_id(int b_id) {
        this.b_id = b_id;
    }
    public String getB_name() {
        return b_name;
    }
    public void setB_name(String b_name) {
        this.b_name = b_name;
    }
    public String getB_email() {
        return b_email;
    }
    public void setB_email(String b_email) {
        this.b_email = b_email;
    }
    public String getB_title() {
        return b_title;
    }
    public void setB_title(String b_title) {
        this.b_title = b_title;
    }
    public String getB_content() {
        return b_content;
    }
    public void setB_content(String b_content) {
        this.b_content = b_content;
    }
    public Timestamp getB_date() {
        return b_date;
    }
    public void setB_date(Timestamp b_date) {
        this.b_date = b_date;
    }

    public int getB_hit() {
        return b_hit;
    }
    public void setB_hit(int b_hit) {
        this.b_hit = b_hit;
    }

    //================ 페이지 목록 ===================

    public static int pageSize =10; //한페이지에 10개의 글을 보여주기 위한 변수
    public static int pageCount = 1; //페이지 개수 카운트, 페이지(컬럼)가 많을 수록 늘어남(초기값)
    public static int pageNum = 1; //페이지 번호(기본값)

    //이부분 정리 다시 해서 노션에 정리하기

    // 84건의 게시글 존재 
    //=&gt; pageCount = 9 
    //pageNum = 1
    //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
    //temp = 0 // (pageNum -1) % limit;
    //startPage = 1 //pageNum(1) - temp(0)

    //if(1-4&gt;0) 거짓
    //for(int i = 1; i&lt;5; i++){
    //    if(1=1)(참) str=[1]
    //    if(1&gt;=9)(거짓) 
    //    }
    //for(int 2 = 1; i&lt;5; i++){
    //    if(2=1) 거짓
    //    else{str=[1]+ [2] //1은 링크가 걸리지 않고 2는 링크가 걸림 
    //  if(2&gt;=9)(거짓) 
    //    }
    //for(int 3 = 1; i&lt;5; i++){
        //    if(3=1) 거짓
        //    else{str=[1]+ [2] +[3]//3에 링크 걸림
        //  if(3&gt;=9)(거짓) 
        //    }
    //for(int 4 = 1; 4&lt;5; i++){
    //    if(4=1) 거짓
    //    else{str=[1]+ [2] + [3] + [4]//4에 링크 걸림
    //  if(4&gt;=9)(거짓) 
    //    }

    //if (5&lt;= 9){ 5[다음]
    //   
    //}


    // 최종적으로 [1]+[2]+[3]+[4]+ 다음 


    //===============================
    // 84건의 게시글 존재 
        //=&gt; pageCount = 9 
        //pageNum = 1
        //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
        //temp = 0 // (pageNum -1) % limit;
        //startPage = 1 //pageNum(1) - temp(0)

        //if(1-4&gt;0) 거짓
        //for(int i = 1; i&lt;5; i++){
            //    if(1=1)(참) str=[1]
            //    if(1&gt;=9)(거짓) 
        //    }
        //for(int 2 = 1; i&lt;5; i++){
            //    if(2=1) 거짓
            //    else{str= [1]+ [2] //1은 링크가 걸리지 않고 2는 링크가 걸림 
            //  if(2&gt;=9)(거짓) 
        //    }
        //for(int 3 = 1; i&lt;5; i++){
            //    if(3=1) 거짓
            //    else{str=[1]+ [2] +[3]//3에 링크 걸림
            //  if(3&gt;=9)(거짓) 
            //    }
        //for(int 4 = 1; 4&lt;5; i++){
            //    if(4=1) 거짓
            //    else{str=[1]+ [2] + [3] + [4]//4에 링크 걸림
            //  if(4&gt;=9)(거짓) 
        //    }

        //if (5&lt;= 9){ 5[다음]
        //   
        //}


        // 최종적으로 [1]+[2]+[3]+[4]+ 다음 


    // 84건의 게시글 존재 
        //=&gt; pageCount = 9 
        //pageNum = 5
        //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
        //temp = 0 // (pageNum -1) % limit;
        //startPage = 5 //pageNum(5) - temp(0)

        //if(5-4&gt;0) 참 {[이전4]}

        //for(int i = 5; i&lt;9; i++){
            //    if(5=5)(참) str=[이전 4]+[5] : 두개 다 링크 걸려있음
            //    if(5&gt;=9)(거짓) 
        //    }
        //for(int i = 6; i&lt;9; i++){
            //    if(6=1) 거짓
            //    else{str= [이전4]+[5]+[6] //6은 링크가 걸림 
            //  if(6&gt;=9)(거짓) 
        //    }
        //for(int i = 7; i&lt;9; i++){
                //    if(7=5) 거짓
                //    else{str=[이전4]+[5]+[6]+[7]
                //  if(7&gt;=9)(거짓) 
            //    }
        //for(int i = 8; i&lt;9; i++){
            //    if(7=1) 거짓
            //    else{str=[이전4]+[5]+[6]+[7]+[8]
            //  if(3&gt;=9)(거짓) 
        //    }

        //if (9&lt;= 9){ 9[다음]
        //   
        //}


        // 최종적으로 [이전 4]+[5]+[6]+[7]+[8]+ [다음 9]

        // 84건의 게시글 존재 
        //pageCount = 9 
        //pageNum = 9
        //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
        //temp = 0 // (pageNum -1) % limit;
        //startPage = 9 //pageNum(9) - temp(0)

        //if(9-4&gt;0) 참 {[이전8]}
            //for(int i = 9; i&lt;13; i++){
            //    if(9=9)(참) str=[이전 8]+[9] : 두개 다 링크 걸려있음
            //    if(9&gt;=9)참
            //    }
            //if(13&lt;=9)거짓 
        //   
        //}

        //최종적으로 [이전 8]+[9]
    //=============

    public static String pageNumber(int limit) {
        //페이지 목록들을 만들어 주는 메소드
        //int limit -&gt; 몇개의 페이지에 대한 로직을 처리할것인지 설정

        String str =&quot;&quot;;
        int temp = (pageNum -1) % limit;//시작 페이지를 구함
        int startPage = pageNum - temp; // 시작페이지 설정 &quot;1 - 0 = 1&quot; 이기 때문에 1이 됨

        if((startPage - limit) &gt; 0) {//[이전]을 구현하기 위한 if문
            //limit 4, temp 0 , startPage 1이라고 가정했을때
            //if((1-4)&gt;0)
            //pageNum = 5 인경우 =&gt; startPage 5
            //if((5-4) &gt;0 ) =&gt; 참 

            str =&quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+(startPage-1)+&quot;&#39;&gt;[이전]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;
            //str = [이전]


        }


        for (int i = startPage; i &lt; (startPage+limit); i++) {
            //페이지 번호가 몇개인지 모름. 즉 페이지 번호를 나열할 필요가 있음

            //for(i = 1; i &lt; 5; i++) - &gt;4까지 나옴
            //pageNum = 5인경우 for(i= 5; i&lt;9;i++)

            if (i == pageNum) {
                //i = 1 이면 링크가 걸리지 않음
                str += &quot;[&quot;+i+&quot;]&amp;nbsp;&amp;nbsp;&quot;;
                //str = [1]
            }else {
                str += &quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+i+&quot;&#39;&gt;[&quot;+i+&quot;]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;
            }

            if (i &gt;= pageCount) {
                break;
            }
        }

        if((startPage + limit) &lt;= pageCount) {//[다음]을 구현하기 위한 if문

            str +=&quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+(startPage+limit)+&quot;&#39;&gt;[다음]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;

//            str = &quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+(startPage-1)+&quot;&#39;&gt;[이전]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;
            //str = [이전]
        }
        return str;
    }
}</code></pre>
<h3 id="boarddbbeanjava">BoardDBBean.java</h3>
<pre><code class="language-java">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
     public int insertBoard(BoardBean board) throws Exception {
          int re = -1;
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          String sql = &quot;&quot;;
          int number;

//          답변글을 위한 변수
          int id = board.getB_id();
          int ref = board.getB_ref();
          int step = board.getB_step();
          int level = board.getB_level();


          try {
             conn = getConnection();
             sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;
             pstmt = conn.prepareStatement(sql);
             rs = pstmt.executeQuery();

             if (rs.next()) {
                number = rs.getInt(1)+1;
             } else { 
                number = 1;
             }

//             id가 값이 있거나 0이거나 둘 중 하나가 될 수 있다. 0 일때는 새글, 0이 아닐 때는 답변글
             if (id != 0) { //답변글일 때
//                update문이 핵심
                sql = &quot;UPDATE BOARDT SET b_step = b_step+1 WHERE b_ref=? AND b_step&gt;?&quot;;
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, ref);
                pstmt.setInt(2, step);
                pstmt.executeUpdate();
                step = step + 1;
                level = level + 1;
             } else { //답변글이 아닐 때=새글
                ref = number;
                step = 0;
                level = 0;
             }

//             System.out.println(&quot;@@@### board.number ===&gt; &quot;+number);
//             System.out.println(&quot;@@@### board.getB_name() ===&gt; &quot;+board.getB_name());
//             System.out.println(&quot;@@@### board.getB_email() ===&gt; &quot;+board.getB_email());
//             System.out.println(&quot;@@@### board.getB_title() ===&gt; &quot;+board.getB_title());
//             System.out.println(&quot;@@@### board.getB_content() ===&gt; &quot;+board.getB_content());
//             System.out.println(&quot;@@@### board.getB_date() ===&gt; &quot;+board.getB_date());
//             System.out.println(&quot;@@@### board.getB_pwd() ===&gt; &quot;+board.getB_pwd());
//             System.out.println(&quot;@@@### board.getB_ip() ===&gt; &quot;+board.getB_ip());

//             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?)&quot;;
//             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?,?,?,?)&quot;;
             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)&quot;;
             pstmt = conn.prepareStatement(sql);

             pstmt.setInt(1, number);
             pstmt.setString(2, board.getB_name());
             pstmt.setString(3, board.getB_email());
             pstmt.setString(4, board.getB_title());
             pstmt.setString(5, board.getB_content());
             pstmt.setTimestamp(6, board.getB_date());
             pstmt.setInt(7, board.getB_hit());
             pstmt.setString(8, board.getB_pwd());
             pstmt.setString(9, board.getB_ip());
             pstmt.setInt(10, ref);
             pstmt.setInt(11, step);
             pstmt.setInt(12, level);
             pstmt.setString(13, board.getB_fname());
             pstmt.setInt(14, board.getB_fsize());
             pstmt.executeUpdate();

             re = 1;
//             re = pstmt.executeUpdate();
          }  catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
             try {
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
             } catch(Exception e) {
                e.printStackTrace();
             }
          }

          return re;
       }

    //4. 리턴타입이 ArrayList&lt;BoardBean&gt; 인 listBoard() 메소드 추가(글목록을 위한 메소드)
    public ArrayList&lt;BoardBean&gt; listBoard(String pageNumber) throws Exception{//제네릭 사용함 , 파라미터는 BoardBean

        Connection conn = null;//데이터 베이스 접속
        Statement stmt = null;// DB에 SQL 전달
        int dbCount = 0;//글이 몇개나 있는지 확인(게시글의 갯수
        int absoultepage = 0;//글이 몇개나 있는지 확인(게시글의 갯수
        ResultSet rs = null;
        ResultSet pageSet = null;

        //db 정보 받기 위함
        String sql=&quot; SELECT b_id \r\n&quot; + 
                &quot;     , b_name\r\n&quot; + 
                &quot;     , b_email\r\n&quot; + 
                &quot;     , b_title\r\n&quot; + 
                &quot;     , b_content\r\n&quot; + 
                &quot;     , b_date\r\n&quot; + 
                &quot;     , b_hit\r\n&quot; + 
                &quot;     , b_pwd\r\n&quot; + 
                &quot;     , b_ip\r\n&quot; + 
                &quot;     , b_ref\r\n&quot; + 
                &quot;     , b_step\r\n&quot; + 
                &quot;     , b_level\r\n&quot; + 
                &quot;     , b_fname\r\n&quot; + 
                &quot;     , b_fsize\r\n&quot; + 
                &quot;  FROM BOARDT\r\n&quot; + 
                &quot; ORDER BY b_ref desc, b_step asc&quot;;//해당 데이터 쿼리 정렬되게끔 함.


        String sql2=&quot;SELECT COUNT(b_id) FROM BOARDT&quot;;

        ArrayList&lt;BoardBean&gt; boardList = new ArrayList&lt;BoardBean&gt;();//ArrayList로 게시글들을 받음
        try {
            conn = getConnection();
//            stmt = conn.createStatement();// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            // 매개변수 (,변경전 내용을 저장하겠다.)
            // DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pageSet = stmt.executeQuery(sql2);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(pageSet.next()) {
                dbCount = pageSet.getInt(1);
                pageSet.close();
            }

            if (dbCount % BoardBean.pageSize == 0) { //pageCount 세팅(페이지 개수를 알려주기 위해 사용)
                //80 % 10 = 0
                BoardBean.pageCount = dbCount / BoardBean.pageSize; //80 /10
            } else {//84 % 10 = 4
                BoardBean.pageCount = dbCount / BoardBean.pageSize +1 ; //80/10 +1
            }


            if (pageNumber != null) {
                BoardBean.pageNum = Integer.parseInt(pageNumber); //매개변수에 해당되는 pageNumber 세팅
                absoultepage = (BoardBean.pageNum - 1) * BoardBean.pageSize + 1;
            }

            rs = stmt.executeQuery(sql);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if (rs.next()) {//while문을 감쌈
                rs.absolute(absoultepage);
                int count = 0;

                while(count &lt; BoardBean.pageSize) {//pageSize수 (10번) 만큼  반복
                    //다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.

                    BoardBean board = new BoardBean();
                    //결과값을 세팅
                    board.setB_id(rs.getInt(1));//아이디는 INT이므로 getInt로 해야함
                    board.setB_name(rs.getString(2));
                    board.setB_email(rs.getString(3));
                    board.setB_title(rs.getString(4));
                    board.setB_content(rs.getString(5));
                    board.setB_date(rs.getTimestamp(6));
                    board.setB_hit(rs.getInt(7));//조회수는 INT이므로 getInt로 해야함
                    board.setB_pwd(rs.getString(8));
                    board.setB_ip(rs.getString(9));
                    board.setB_ref(rs.getInt(10));
                    board.setB_step(rs.getInt(11));
                    board.setB_level(rs.getInt(12));
                    board.setB_fname(rs.getString(13));
                    board.setB_fsize(rs.getInt(14));

    //                데이터가 제대로 들어갔는지 확인 해야함
    //                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
    //                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
    //                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
    //                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
    //                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
    //                System.out.println(&quot;@@@@#### board.getB_pwd()=====&gt;&quot;+board.getB_pwd());
    //                System.out.println(&quot;@@@@####&quot;);

                    boardList.add(board);//반복하면서 게시글들을 쌓음

                    if (rs.isLast()) {//결과값이 마지막이면 빠져나오기
                        break;
                    } else {
                        rs.next();//마지막이 아니면 계속 진행
                    }

                    count++;
                }

            }
        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(stmt != null)  stmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return boardList;
    }


    // 5. 리턴타입이 BoardBean인 getBoard() 메소드 추가
    public BoardBean getBoard (int bid, boolean hitadd) throws Exception{
        //글번호만 넘기면 알아서 내용이 넘어가는 메소드
        //조회 수 때문에 분기처리  해가

        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        PreparedStatement pstmtup = null;// 조회수 업데이트
        ResultSet rs = null;
        //db 정보 받기 위함
        BoardBean board = null;
        String sql = &quot;&quot;;//해당 번호의 데이터 출력되게 쿼리 작성

        try {
            conn = getConnection();
            if (hitadd==true) {
                //조회수 업데이트 추가함
                sql = &quot;UPDATE BOARDT SET b_hit=b_hit+1 WHERE b_id=?&quot;;
                pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
                pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
//            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리
                pstmt.executeUpdate();//업데이트니깐 업데이트로 바꿔줌
                //pstmtup.close();
                //업데이트 추가 끝!
            }

            sql = &quot;SELECT b_id\r\n&quot; + 
                    &quot;    , b_name\r\n&quot; + 
                    &quot;    , b_email\r\n&quot; + 
                    &quot;    , b_title\r\n&quot; + 
                    &quot;    , b_content\r\n&quot; + 
                    &quot;    , b_date\r\n&quot; + 
                    &quot;    , b_hit\r\n&quot; + 
                    &quot;    , b_pwd\r\n&quot; + 
                    &quot;    , b_ip\r\n&quot; + 
                    &quot;    , b_ref\r\n&quot; + 
                    &quot;    , b_level\r\n&quot; + 
                    &quot;    , b_step\r\n&quot; + 
                    &quot;    , b_fname\r\n&quot; + 
                    &quot;    , b_fsize\r\n&quot; + 
                    &quot; FROM BOARDT\r\n&quot; + 
                    &quot; WHERE b_id=?&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
            rs = pstmt.executeQuery();//select 문이니깐 익스큐트 쿼리


            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                board = new BoardBean();//객체생성(리턴값이 board)
                board.setB_id(rs.getInt(1));
                //board.setB_id(bid);도 가능함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
                board.setB_date(rs.getTimestamp(6));
                board.setB_hit(rs.getInt(7));
                board.setB_pwd(rs.getString(8));
                board.setB_ip(rs.getString(9));
                board.setB_ref(rs.getInt(10));//조회수는 INT이므로 getInt로 해야함
                board.setB_step(rs.getInt(11));
                board.setB_level(rs.getInt (12));
                board.setB_fname(rs.getString(13));
                board.setB_fsize(rs.getInt (14));
//                
////                데이터가 제대로 들어갔는지 확인 해야함
                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
                System.out.println(&quot;@@@@#### board.getB_fname()=====&gt;&quot;+board.getB_fname());
                System.out.println(&quot;@@@@#### board.getB_fsize()=====&gt;&quot;+board.getB_fsize());
                //System.out.println(&quot;@@@@#### board.setB_pwd()=====&gt;&quot;+board.setB_pwd(sql));
            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return board;
    }


    // 6.deleteBoard() 메소드 =&gt; 삭제할 글 비밀번호 확인하는 메소드 
    public int deleteBoard (int b_id, String b_pwd) throws Exception{//글번호만 넘기면 알아서 내용이 넘어가는 메소드 
        // id와 pwd를 받아 삭제하는 메소드 
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        int re = -1;


        String sql = &quot;&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
        String pwd = &quot;&quot;;//비밀번호 


        try {
            conn = getConnection();
            sql = &quot;SELECT B_PWD FROM BOARDT where B_ID=?&quot;; // 글 번호에 따른 비밀번호 가지고 오기
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
            pstmt.setInt(1, b_id);//값을 집어넣음(쿼리의 ?부분)
            rs = pstmt.executeQuery();

            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                pwd = rs.getString(1);
                //비밀번호를 
                if (pwd.equals(b_pwd)) {
                    sql = &quot;DELETE FROM BOARDT WHERE B_ID=?&quot;;
                    pstmt = conn.prepareStatement(sql);//pstmt객체로 쿼리를 받음
                    pstmt.setInt(1, b_id);
                    pstmt.executeUpdate();
                    re = 1;
                }else {
                    re =0;
                }

            }

        } catch(SQLException ex) {
             System.out.println(&quot;삭제 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
    }

    //7.테이블 수정 editBoard 메소드
        public int editBoard (BoardBean board) throws Exception{
            int re = -1;
            Connection conn = null;//데이터 베이스 접속
            PreparedStatement pstmt = null;// DB에 SQL 전달
            ResultSet rs = null;
            String sql =&quot;&quot;;
            String pwd = &quot;&quot;;//비밀번호 


            try {
                conn = getConnection();
                sql = &quot;SELECT B_PWD FROM BOARDT where B_ID=?&quot;; // 글 번호에 따른 비밀번호 가지고 오기
                pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
                pstmt.setInt(1, board.getB_id());//값을 집어넣음(쿼리의 ?부분),board 객체를 이용하여 b_id 가지고 오기
                rs = pstmt.executeQuery();

                if (rs.next()) {
                    pwd = rs.getString(1);

                    if  (pwd.equals(board.getB_pwd())) {
                        sql=&quot;UPDATE BOARDT \r\n&quot; + 
                                &quot;      SET B_NAME=?\r\n&quot; + 
                                &quot;        , B_EMAIL=?\r\n&quot; + 
                                &quot;        , B_TITLE=?\r\n&quot; + 
                                &quot;        , B_CONTENT=?\r\n&quot; + 
                                &quot;        WHERE B_ID=?&quot;;

                        pstmt = conn.prepareStatement(sql);//pstmt객체로 쿼리를 받음
                        pstmt.setString(1,board.getB_name());
                        pstmt.setString(2,board.getB_email());
                        pstmt.setString(3,board.getB_title());
                        pstmt.setString(4,board.getB_content());
                        pstmt.setInt(5, board.getB_id());
                        pstmt.executeUpdate();
                        re = 1;
                    }else {
                        re =0;//비밀번호가 같지 않은것
                    }
                }

            } catch(SQLException ex) {
                 System.out.println(&quot;수정 실패&quot;);
                 ex.printStackTrace();
              } finally {
                  try{//자원반납(순서 중요)
                      if(rs != null)  rs.close();
                      if(conn != null)  conn.close();
                      if(pstmt != null)  pstmt.close();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
              }
            return re;    
        }
}</code></pre>
<h3 id="writejsp">write.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음


    int b_id=0, b_ref=1, b_step=0, b_level=0;
    String b_title=&quot;&quot;;
    if(request.getParameter(&quot;b_id&quot;) != null){
        b_id = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    }    

    BoardDBBean db = BoardDBBean.getInstance();
    BoardBean board = db.getBoard(b_id, false);

    if(board != null){
        b_title = board.getB_title();
        b_ref = board.getB_ref();
        b_step = board.getB_step();
        b_level = board.getB_level();
    }
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
    &lt;script language=&quot;JavaScript&quot; src=&quot;board.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 올 리 기&lt;/h1&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot; enctype=&quot;multipart/form-data&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_id&quot; value=&quot;&lt;%= b_id %&gt;&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_ref&quot; value=&quot;&lt;%= b_ref %&gt;&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_step&quot; value=&quot;&lt;%= b_step %&gt;&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_level&quot; value=&quot;&lt;%= b_level %&gt;&quot;&gt;
            &lt;table&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot;&gt;
                    &lt;/td&gt;
                    &lt;td width=&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot; size=&quot;24&quot; maxlength=&quot;50&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;글제목&lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;%
                            if(b_id == 0){
                        %&gt;
                                &lt;input type=&quot;text&quot; name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;&gt;
                        &lt;%
                            }else{
                        %&gt;
                                &lt;input type=&quot;text&quot; name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;
                                     value=&quot;[답변]:&lt;%= b_title %&gt;&quot;&gt;
                        &lt;%
                            }
                        %&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;파  일&lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;140&quot;&gt;
                        &lt;input type=&quot;file&quot; name=&quot;b_fname&quot; size=&quot;40&quot; maxlength=&quot;100&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;&gt;
                        &lt;textarea name=&quot;b_content&quot; rows=&quot;10&quot; cols=&quot;65&quot;&gt;&lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;암&amp;nbsp;&amp;nbsp;호&lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;password&quot; name=&quot;b_pwd&quot; size=&quot;12&quot; maxlength=&quot;12&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;50&quot; align=&quot;center&quot;&gt;
                    &lt;td colspan=&quot;4&quot;&gt;
                        &lt;input type=&quot;button&quot; value=&quot;글쓰기&quot; onclick=&quot;check_ok()&quot;&gt;&amp;nbsp;
                        &lt;input type=&quot;reset&quot; value=&quot;다시작성&quot;&gt;
                        &lt;input type=&quot;button&quot; value=&quot;글목록&quot; onclick=&quot;location.href=&#39;list.jsp?pageNum=&lt;%=pageNum%&gt;&#39;&quot;&gt;&amp;nbsp;
                        &lt;!-- 페이지 목록에 맞춰서 이동할 수 있도록 함  --&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h3 id="write_okjsp">write_ok.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;com.jspsmart.upload.SmartUpload&quot;%&gt;
&lt;%@page import=&quot;com.jspsmart.upload.File&quot;%&gt;
&lt;%@page import=&quot;java.net.InetAddress&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;% 
    request.setCharacterEncoding(&quot;UTF-8&quot;);  
%&gt;  
&lt;jsp:useBean class=&quot;magic.board.BoardBean&quot; id=&quot;board&quot;&gt;&lt;/jsp:useBean&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;

&lt;%
//파일 업로드

    SmartUpload upload = new SmartUpload();//객체생성
    upload.initialize(pageContext);//기본 객체 초기화
    upload.upload();//upload 메소드 호출

    String fName =null;
    int fileSize = 0;

    File file = upload.getFiles().getFile(0);//파일이 하나이니깐 0으로 하면 됨 여러개면 반복문 사용해서 i로 두기(for)

    if(!file.isMissing()){
        fName = file.getFileName();
        file.saveAs(&quot;/upload/&quot;+file.getFileName());//파일 이름을 저장하겠다.
        fileSize = file.getSize();
    }

%&gt;

&lt;%
    InetAddress address = InetAddress.getLocalHost();
    String ip = address.getHostAddress();

    //별도로 write.jsp의 name 처리
    //데이터 입력하였을때 null값이 뜨기 때문에 처리가 필요함
    board.setB_name(upload.getRequest().getParameter(&quot;b_name&quot;));//upload객체 이용해서 사용
    board.setB_email(upload.getRequest().getParameter(&quot;b_email&quot;));//upload객체 이용해서 사용
    board.setB_title(upload.getRequest().getParameter(&quot;b_title&quot;));//upload객체 이용해서 사용
    board.setB_content(upload.getRequest().getParameter(&quot;b_content&quot;));//upload객체 이용해서 사용
    board.setB_pwd(upload.getRequest().getParameter(&quot;b_pwd&quot;));//upload객체 이용해서 사용
    //

    board.setB_date(new Timestamp(System.currentTimeMillis()));
    //board.setB_ip(request.getRemoteAddr());
    board.setB_ip(ip);

    //파일 업로드 관련 부분
    board.setB_fname(fName);
    board.setB_fsize(fileSize);
    ////파일 업로드 관련 부분 끝! 


    BoardDBBean db = BoardDBBean.getInstance();
    int re = db.insertBoard(board);




    if(re == 1){
        response.sendRedirect(&quot;list.jsp&quot;);
    }else{
        response.sendRedirect(&quot;write.jsp&quot;);
    }
%&gt;</code></pre>
<h3 id="listjsp">list.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;java.util.ArrayList&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음

    if(pageNum == null){//list를 처음 실행하였을때 아무것도 없을때 보여줄 페이지
        pageNum =&quot;1&quot;;
    }

    BoardDBBean db = BoardDBBean.getInstance();
    ArrayList&lt;BoardBean&gt; boardList = db.listBoard(pageNum);
    int b_id, b_hit, b_level=0, b_fsize=0;//초기값 0
    String b_name, b_email, b_title, b_content,b_fname;
    Timestamp b_date;
    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm&quot;);
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;게시판에 등록된 글 목록 보기&lt;/h1&gt;
        &lt;table width=&quot;600&quot;&gt;
            &lt;tr&gt;
                &lt;td align=&quot;right&quot;&gt;
                    &lt;a href=&quot;write.jsp?pageNum=&lt;%=pageNum%&gt;&quot;&gt;글 쓰 기&lt;/a&gt;
                    &lt;!-- 페이지 목록 번호에 맞게 글 쓰기 이동  --&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/center&gt;
    &lt;center&gt;
        &lt;table border=&quot;1&quot; width=&quot;800&quot; cellspacing=&quot;0&quot;&gt;
            &lt;tr height=&quot;25&quot;&gt;
                &lt;td width=&quot;40&quot; align=&quot;center&quot;&gt;번호&lt;/td&gt;
                &lt;td width=&quot;80&quot; align=&quot;center&quot;&gt;첨부파일&lt;/td&gt;
                &lt;td width=&quot;450&quot; align=&quot;center&quot;&gt;글제목&lt;/td&gt;
                &lt;td width=&quot;120&quot; align=&quot;center&quot;&gt;작성자&lt;/td&gt;
                &lt;td width=&quot;130&quot; align=&quot;center&quot;&gt;작성일&lt;/td&gt;
                &lt;td width=&quot;60&quot; align=&quot;center&quot;&gt;조회수&lt;/td&gt;
            &lt;/tr&gt;
            &lt;%
                for(int i=0; i&lt;boardList.size(); i++){
                    BoardBean board = boardList.get(i);

                    b_id = board.getB_id();
                    b_name = board.getB_name();
                    b_email = board.getB_email();
                    b_title = board.getB_title();
                    b_content = board.getB_content();
                    b_date = board.getB_date();
                    b_hit = board.getB_hit();
                    b_level = board.getB_level();
                    b_fname = board.getB_fname();
                    b_fsize = board.getB_fsize();
            %&gt;
            &lt;tr height=&quot;25&quot; bgcolor=&quot;#f7f7f7&quot;
                onmouseover=&quot;this.style.backgroundColor=&#39;#eeeeef&#39;&quot;
                onmouseout=&quot;this.style.backgroundColor=&#39;#f7f7f7&#39;&quot;&gt;
                &lt;td align=&quot;center&quot;&gt;&lt;%= b_id %&gt;&lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;
                    &lt;%
                        if(b_fsize &gt; 0){
                    %&gt;
                            &lt;img src=&quot;../images/zip.gif&quot;&gt;
                    &lt;%
                        }

                    %&gt;
                &lt;/td&gt;
                &lt;td&gt;
                    &lt;%
                        if(b_level &gt; 0){
                            for(int j=0; j&lt;b_level; j++){
                    %&gt;
                                &amp;nbsp;
                    &lt;%
                            }
                    %&gt;
                            &lt;img src=&quot;../images/AnswerLine.gif&quot; width=&quot;16&quot; height=&quot;16&quot;&gt;
                    &lt;%
                        }
                    %&gt;
                    &lt;a href=&quot;show.jsp?b_id=&lt;%= b_id %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&quot;&gt;
                        &lt;%= b_title %&gt;
                    &lt;/a&gt;
                &lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;
                    &lt;a href=&quot;mailto:&lt;%= b_email %&gt;&quot;&gt;
                        &lt;%= b_name %&gt;
                    &lt;/a&gt;
                &lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;
                    &lt;%-- &lt;%= b_date %&gt; --%&gt;
                    &lt;%= sdf.format(b_date) %&gt;
                &lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;
                    &lt;%= b_hit %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;%
                }
            %&gt;
        &lt;/table&gt;

        &lt;%= BoardBean.pageNumber(4) %&gt;
        &lt;!--  return 받아서 4페이지씩 나눠서 출력  --&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="showjsp">show.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%    
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음    

    int bid = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    BoardDBBean db = BoardDBBean.getInstance();
    //BoardBean board = db.getBoard(bid);
    BoardBean board = db.getBoard(bid, true);
    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm&quot;);
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 내 용 보 기&lt;/h1&gt;
        &lt;table border=&quot;1&quot; width=&quot;600&quot; cellspacing=&quot;0&quot;&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글번호&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= bid %&gt;
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;조회수&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= board.getB_hit() %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;작성자&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= board.getB_name() %&gt;
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;작성일&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%-- &lt;%= board.getB_date() %&gt; --%&gt;
                    &lt;%= sdf.format(board.getB_date()) %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;110&quot;&gt;파&amp;nbsp;&amp;nbsp;일&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;center&quot; colspan=&quot;3&quot;&gt;
                    &amp;nbsp;
                    &lt;%
                        if(board.getB_fname() != null){ 
                    %&gt;
                             &lt;img src=&quot;../images/zip.gif&quot;&gt;
                             &lt;a href=&quot;../upload/&lt;%= board.getB_fname() %&gt;&quot;&gt;
                                    원본파일 : &lt;%= board.getB_fname() %&gt;
                             &lt;/a&gt;
                    &lt;%
                        }
                    %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글제목&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;left&quot; colspan=&quot;3&quot;&gt;
                    &lt;%= board.getB_title() %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글내용&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;left&quot; colspan=&quot;3&quot;&gt; 
                    &lt;%= board.getB_content() %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td colspan=&quot;4&quot; align=&quot;right&quot;&gt;
                &lt;!--  페이지 목록에 맞춰야 해서 모두 쿼리스트링을 사용하여 pageNum=&lt;2%=pageNum%2&gt; 넣어야함 --&gt;
                    &lt;input type=&quot;button&quot; value=&quot;글수정&quot; onclick=&quot;location.href=&#39;edit.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;input type=&quot;button&quot; value=&quot;글삭제&quot; onclick=&quot;location.href=&#39;delete.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;input type=&quot;button&quot; value=&quot;답변글&quot; onclick=&quot;location.href=&#39;write.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;input type=&quot;button&quot; value=&quot;글목록&quot; onclick=&quot;location.href=&#39;list.jsp?pageNum=&lt;%=pageNum%&gt;&#39;&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="delete_okjsp">delete_ok.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;java.io.File&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot; %&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;

    &lt;%
        String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음

        int b_id = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
        //입력 받은 id 값을  onclick으로 넘겨줌

        String b_pwd = request.getParameter(&quot;b_pwd&quot;);
        // 비밀번호도 다시 받음

        BoardDBBean db = BoardDBBean.getInstance();
        //getInstance로 BoardDBBean 객체 생성
        BoardBean board = db.getBoard(b_id, false);//조회수 증가 필요 없음으로 false
        String fName = board.getB_fname();//파일명 가지고 오기 
        String up =&quot;D:\\space_jsp\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\magicWebApp\\upload\\&quot;;
        //경로 변수로 주기

        int re =  db.deleteBoard(b_id, b_pwd);
        //deleteBoard 메소드 호출하여 글번호와 비밀번호 넘김


        if(re == 1){//비밀번호가 동일 할 경우//게시글이 정상적으로 삭제되었을때 
            response.sendRedirect(&quot;list.jsp?pageNum=&quot;+pageNum);

            if(fName != null){
                File file = new File(up+fName); //생성자 매개변수 : 폴더경로+파일이름
                file.delete();//파일 삭제 메소드 delete();
            }
        }else if(re == 0){//비밀번호가 다른 경우
    %&gt;
            &lt;script language=&quot;JavaScript&quot;&gt;
                alert(&quot;비밀번호가 맞지 않습니다.&quot;);
                history.go(-1);//이전페이지로 이동
            &lt;/script&gt;
    &lt;%    
        }else if(re == -1){//글번호가 없는 경우(삭제 실패한 경우)
    %&gt;
            &lt;script language=&quot;JavaScript&quot;&gt;
                alert(&quot;삭제에 실패하였습니다.&quot;);
                history.go(-1);
            &lt;/script&gt;
    &lt;%    
        }
    %&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/5764cd6b-5d74-471e-b1da-9f8e16d557d8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/829903c0-8fdf-4afa-8e46-005f4012cd1f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/f138ed60-4d9c-40ee-800e-f7f8a7084b2d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/e5afe6cc-cf77-44f6-a7dd-4bced3d4ea74/image.png" alt=""></p>
<p>잘 작동 됨.</p>
<hr>
<h1 id="자료실-ppt04">자료실 PPT.04</h1>
<p>a.txt파일을 만들어서(내용 abc) 업로드하고 (첫번째 게시물) 클릭하면 abc가 뜸.</p>
<p>다시  내용만 변경 후(abc ⇒ xyz,  a.txt파일) 업로드 하였을 때(두번째 게시물) 클릭하면 xyz가 뜸.</p>
<p>근데 첫번째 게시물을 확인해보면 abc가 아니라 xyz가 뜸.</p>
<p>만약에 제목은 같고 내용은 다른 파일을 첨부하였다면 기존의 데이터 또는 이름이 같은 파일의 데이터를 손실할 수있음. 이를 막기 위한 코드 필요</p>
<p>(자료실 4)</p>
<h2 id="💡기존-게시판-소스에-자료를-첨부하는-할-때-구별할-수있도록-하는-기능-추가">💡기존 게시판 소스에 자료를 첨부하는 할 때 구별할 수있도록 하는 기능 추가</h2>
<p>(위의 설명 참고)</p>
<blockquote>
<p>💡</p>
</blockquote>
<ul>
<li>BoardBean.java<ul>
<li>private String b_rfname;</li>
</ul>
</li>
<li>write_ok.jsp <ul>
<li>파일 업로드 처리</li>
</ul>
</li>
<li>BoardDBBean.java<ul>
<li>insertBoard() 메소드 =&gt; insert 시 실제 파일 이름 추가</li>
<li>getBoard() 메소드    =&gt; 조회시</li>
<li>BoardBean getFileName(int bid) =&gt; (신규) 파일정보 가져오기</li>
</ul>
</li>
<li>show.jsp <ul>
<li>실제파일 내용 표시(FileDownload.jsp 첨부파일 표시)</li>
</ul>
</li>
<li>FileDownload.jsp =&gt; 신규 추가</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ada5b2e5-f6cf-4afc-bec0-221513c54e21/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/9a8ca0bd-a5a5-4a3c-8a0a-ae28023e6b32/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/f0cea426-0fd9-482d-aab8-8941954dc3b3/image.png" alt=""></p>
<h3 id="write_okjsp-1">write_ok.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;java.util.Enumeration&quot;%&gt;
&lt;%@page import=&quot;com.oreilly.servlet.multipart.DefaultFileRenamePolicy&quot;%&gt;
&lt;%@page import=&quot;com.oreilly.servlet.MultipartRequest&quot;%&gt;
&lt;%@page import=&quot;com.jspsmart.upload.SmartUpload&quot;%&gt;
&lt;%@page import=&quot;com.jspsmart.upload.File&quot;%&gt;
&lt;%@page import=&quot;java.net.InetAddress&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;% 
    request.setCharacterEncoding(&quot;UTF-8&quot;);  
%&gt;  
&lt;jsp:useBean class=&quot;magic.board.BoardBean&quot; id=&quot;board&quot;&gt;&lt;/jsp:useBean&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;

&lt;%
//    파일 업로드    자료실 3
    /* SmartUpload upload = new SmartUpload();//객체생성
    upload.initialize(pageContext);//기본 객체 초기화
    upload.upload();//upload 메소드 호출

    String fName =null;
    String rfName =null;
    int fileSize = 0;

    File file = upload.getFiles().getFile(0);//파일이 하나이니깐 0으로 하면 됨 여러개면 반복문 사용해서 i로 두기(for)

    if(!file.isMissing()){
        fName = file.getFileName();
        file.saveAs(&quot;/upload/&quot;+file.getFileName());//파일 이름을 저장하겠다.
        fileSize = file.getSize();
    }
     */

     //자료실  4
     String path = request.getRealPath(&quot;upload&quot;);
     int size=1024*1024;
     int fileSize=0;//초기값0
     String file=&quot;&quot;;//파일
     String oriFile=&quot;&quot;;//실제 파일
     MultipartRequest multi = new MultipartRequest(request,path,size,&quot;UTF-8&quot;,new DefaultFileRenamePolicy());//레퀘스트, 경로,사이즈,언어, 기본파일변경정책 사용??
     // 걍 MultipartRequest을 이런식으로 객체 생성해서 사용한다라고 이해하면 될 듯 
     Enumeration files = multi.getFileNames();
     String str =(String)files.nextElement();
     //실제 파일 이름 하나를 받음
     file = multi.getFilesystemName(str);

     if(file != null){//파일이 존재한다면
        oriFile = multi.getOriginalFileName(str);
         fileSize = file.getBytes().length;//파일 변수에서 getBytees()메소드의 length 사용하면 용량..? 
     }

%&gt;

&lt;%
    //ip처리
    InetAddress address = InetAddress.getLocalHost();
    String ip = address.getHostAddress();

    /* //자료실 3
    //별도로 write.jsp의 name 처리
    //데이터 입력하였을때 null값이 뜨기 때문에 처리가 필요함
    //파일을 업로드 하였을때 필요
    board.setB_name(upload.getRequest().getParameter(&quot;b_name&quot;));//upload객체 이용해서 사용
    board.setB_email(upload.getRequest().getParameter(&quot;b_email&quot;));//upload객체 이용해서 사용
    board.setB_title(upload.getRequest().getParameter(&quot;b_title&quot;));//upload객체 이용해서 사용
    board.setB_content(upload.getRequest().getParameter(&quot;b_content&quot;));//upload객체 이용해서 사용
    board.setB_pwd(upload.getRequest().getParameter(&quot;b_pwd&quot;));//upload객체 이용해서 사용
    //별도로 write.jsp의 name 처리 끝! */

    board.setB_name(multi.getParameter(&quot;b_name&quot;));//upload객체 이용해서 사용
    board.setB_email(multi.getParameter(&quot;b_email&quot;));//upload객체 이용해서 사용
    board.setB_title(multi.getParameter(&quot;b_title&quot;));//upload객체 이용해서 사용
    board.setB_content(multi.getParameter(&quot;b_content&quot;));//upload객체 이용해서 사용
    board.setB_pwd(multi.getParameter(&quot;b_pwd&quot;));//upload객체 이용해서 사용
    //board 객체에 set으로 값들을 대입 시킴

    board.setB_date(new Timestamp(System.currentTimeMillis()));
    //board.setB_ip(request.getRemoteAddr());
    board.setB_ip(ip);

    //자료실 3
    //파일 업로드 관련 부분
    //board.setB_fname(fName);
    //board.setB_fsize(fileSize);
    ////파일 업로드 관련 부분 끝! 

    //자료실 4
    if(file != null){//파일이 존재한다면
        board.setB_fname(file);
        board.setB_fsize(fileSize);
        board.setB_rfname(oriFile);
     }
    //자료실 4끝

    BoardDBBean db = BoardDBBean.getInstance();
    int re = db.insertBoard(board);


    if(re == 1){
        response.sendRedirect(&quot;list.jsp&quot;);
    }else{
        response.sendRedirect(&quot;write.jsp&quot;);
    }
%&gt;</code></pre>
<h3 id="boarddbbeanjava-1">BoardDBBean.java</h3>
<pre><code class="language-java">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }

    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
     public int insertBoard(BoardBean board) throws Exception {
          int re = -1;
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          String sql = &quot;&quot;;
          int number;

//          답변글을 위한 변수
          int id = board.getB_id();
          int ref = board.getB_ref();
          int step = board.getB_step();
          int level = board.getB_level();


          try {
             conn = getConnection();
             sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;
             pstmt = conn.prepareStatement(sql);
             rs = pstmt.executeQuery();

             if (rs.next()) {
                number = rs.getInt(1)+1;
             } else { 
                number = 1;
             }

//             id가 값이 있거나 0이거나 둘 중 하나가 될 수 있다. 0 일때는 새글, 0이 아닐 때는 답변글
             if (id != 0) { //답변글일 때
//                update문이 핵심
                sql = &quot;UPDATE BOARDT SET b_step = b_step+1 WHERE b_ref=? AND b_step&gt;?&quot;;
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, ref);
                pstmt.setInt(2, step);
                pstmt.executeUpdate();
                step = step + 1;
                level = level + 1;
             } else { //답변글이 아닐 때=새글
                ref = number;
                step = 0;
                level = 0;
             }

//             System.out.println(&quot;@@@### board.number ===&gt; &quot;+number);
//             System.out.println(&quot;@@@### board.getB_name() ===&gt; &quot;+board.getB_name());
//             System.out.println(&quot;@@@### board.getB_email() ===&gt; &quot;+board.getB_email());
//             System.out.println(&quot;@@@### board.getB_title() ===&gt; &quot;+board.getB_title());
//             System.out.println(&quot;@@@### board.getB_content() ===&gt; &quot;+board.getB_content());
//             System.out.println(&quot;@@@### board.getB_date() ===&gt; &quot;+board.getB_date());
//             System.out.println(&quot;@@@### board.getB_pwd() ===&gt; &quot;+board.getB_pwd());
//             System.out.println(&quot;@@@### board.getB_ip() ===&gt; &quot;+board.getB_ip());

//             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?)&quot;;
//             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?,?,?,?)&quot;;
//             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)&quot;;
             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)&quot;;
             pstmt = conn.prepareStatement(sql);

             pstmt.setInt(1, number);
             pstmt.setString(2, board.getB_name());
             pstmt.setString(3, board.getB_email());
             pstmt.setString(4, board.getB_title());
             pstmt.setString(5, board.getB_content());
             pstmt.setTimestamp(6, board.getB_date());
             pstmt.setInt(7, board.getB_hit());
             pstmt.setString(8, board.getB_pwd());
             pstmt.setString(9, board.getB_ip());
             pstmt.setInt(10, ref);
             pstmt.setInt(11, step);
             pstmt.setInt(12, level);
             pstmt.setString(13, board.getB_fname());
             pstmt.setInt(14, board.getB_fsize());
             pstmt.setString(15, board.getB_rfname());
             pstmt.executeUpdate();

             re = 1;
//             re = pstmt.executeUpdate();
          }  catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
             try {
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
             } catch(Exception e) {
                e.printStackTrace();
             }
          }

          return re;
       }

    //4. 리턴타입이 ArrayList&lt;BoardBean&gt; 인 listBoard() 메소드 추가(글목록을 위한 메소드)
    public ArrayList&lt;BoardBean&gt; listBoard(String pageNumber) throws Exception{//제네릭 사용함 , 파라미터는 BoardBean

        Connection conn = null;//데이터 베이스 접속
        Statement stmt = null;// DB에 SQL 전달
        int dbCount = 0;//글이 몇개나 있는지 확인(게시글의 갯수
        int absoultepage = 0;//글이 몇개나 있는지 확인(게시글의 갯수
        ResultSet rs = null;
        ResultSet pageSet = null;


        //db 정보 받기 위함
        String sql=&quot; SELECT b_id \r\n&quot; + 
                &quot;     , b_name\r\n&quot; + 
                &quot;     , b_email\r\n&quot; + 
                &quot;     , b_title\r\n&quot; + 
                &quot;     , b_content\r\n&quot; + 
                &quot;     , b_date\r\n&quot; + 
                &quot;     , b_hit\r\n&quot; + 
                &quot;     , b_pwd\r\n&quot; + 
                &quot;     , b_ip\r\n&quot; + 
                &quot;     , b_ref\r\n&quot; + 
                &quot;     , b_step\r\n&quot; + 
                &quot;     , b_level\r\n&quot; + 
                &quot;     , b_fname\r\n&quot; + 
                &quot;     , b_fsize\r\n&quot; + 
                &quot;  FROM BOARDT\r\n&quot; + 
                &quot; ORDER BY b_ref desc, b_step asc&quot;;//해당 데이터 쿼리 정렬되게끔 함.



        String sql2=&quot;SELECT COUNT(b_id) FROM BOARDT&quot;;



        ArrayList&lt;BoardBean&gt; boardList = new ArrayList&lt;BoardBean&gt;();//ArrayList로 게시글들을 받음

        try {
            conn = getConnection();
//            stmt = conn.createStatement();// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            // 매개변수 (,변경전 내용을 저장하겠다.)
            // DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pageSet = stmt.executeQuery(sql2);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(pageSet.next()) {
                dbCount = pageSet.getInt(1);
                pageSet.close();
            }

            if (dbCount % BoardBean.pageSize == 0) { //pageCount 세팅(페이지 개수를 알려주기 위해 사용)
                //80 % 10 = 0
                BoardBean.pageCount = dbCount / BoardBean.pageSize; //80 /10
            } else {//84 % 10 = 4
                BoardBean.pageCount = dbCount / BoardBean.pageSize +1 ; //80/10 +1
            }


            if (pageNumber != null) {
                BoardBean.pageNum = Integer.parseInt(pageNumber); //매개변수에 해당되는 pageNumber 세팅
                absoultepage = (BoardBean.pageNum - 1) * BoardBean.pageSize + 1;
            }

            rs = stmt.executeQuery(sql);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if (rs.next()) {//while문을 감쌈
                rs.absolute(absoultepage);
                int count = 0;

                while(count &lt; BoardBean.pageSize) {//pageSize수 (10번) 만큼  반복
                    //다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.

                    BoardBean board = new BoardBean();
                    //결과값을 세팅
                    board.setB_id(rs.getInt(1));//아이디는 INT이므로 getInt로 해야함
                    board.setB_name(rs.getString(2));
                    board.setB_email(rs.getString(3));
                    board.setB_title(rs.getString(4));
                    board.setB_content(rs.getString(5));
                    board.setB_date(rs.getTimestamp(6));
                    board.setB_hit(rs.getInt(7));//조회수는 INT이므로 getInt로 해야함
                    board.setB_pwd(rs.getString(8));
                    board.setB_ip(rs.getString(9));
                    board.setB_ref(rs.getInt(10));
                    board.setB_step(rs.getInt(11));
                    board.setB_level(rs.getInt(12));
                    board.setB_fname(rs.getString(13));
                    board.setB_fsize(rs.getInt(14));

    //                데이터가 제대로 들어갔는지 확인 해야함
    //                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
    //                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
    //                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
    //                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
    //                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
    //                System.out.println(&quot;@@@@#### board.getB_pwd()=====&gt;&quot;+board.getB_pwd());
    //                System.out.println(&quot;@@@@####&quot;);

                    boardList.add(board);//반복하면서 게시글들을 쌓음

                    if (rs.isLast()) {//결과값이 마지막이면 빠져나오기
                        break;
                    } else {
                        rs.next();//마지막이 아니면 계속 진행
                    }

                    count++;
                }

            }
        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(stmt != null)  stmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return boardList;
    }


    // 5. 리턴타입이 BoardBean인 getBoard() 메소드 추가
    public BoardBean getBoard (int bid, boolean hitadd) throws Exception{
        //글번호만 넘기면 알아서 내용이 넘어가는 메소드
        //조회 수 때문에 분기처리  해가

        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        PreparedStatement pstmtup = null;// 조회수 업데이트
        ResultSet rs = null;
        //db 정보 받기 위함
        BoardBean board = null;
        String sql = &quot;&quot;;//해당 번호의 데이터 출력되게 쿼리 작성

        try {
            conn = getConnection();
            if (hitadd==true) {
                //조회수 업데이트 추가함
                sql = &quot;UPDATE BOARDT SET b_hit=b_hit+1 WHERE b_id=?&quot;;
                pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
                pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
//            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리
                pstmt.executeUpdate();//업데이트니깐 업데이트로 바꿔줌
                //pstmtup.close();
                //업데이트 추가 끝!
            }

            sql = &quot;SELECT b_id\r\n&quot; + 
                    &quot;    , b_name\r\n&quot; + 
                    &quot;    , b_email\r\n&quot; + 
                    &quot;    , b_title\r\n&quot; + 
                    &quot;    , b_content\r\n&quot; + 
                    &quot;    , b_date\r\n&quot; + 
                    &quot;    , b_hit\r\n&quot; + 
                    &quot;    , b_pwd\r\n&quot; + 
                    &quot;    , b_ip\r\n&quot; + 
                    &quot;    , b_ref\r\n&quot; + 
                    &quot;    , b_level\r\n&quot; + 
                    &quot;    , b_step\r\n&quot; + 
                    &quot;    , b_fname\r\n&quot; + 
                    &quot;    , b_fsize\r\n&quot; + 
                    &quot;    , b_rfname\r\n&quot; + 
                    &quot; FROM BOARDT\r\n&quot; + 
                    &quot; WHERE b_id=?&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
            rs = pstmt.executeQuery();//select 문이니깐 익스큐트 쿼리


            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                board = new BoardBean();//객체생성(리턴값이 board)
                board.setB_id(rs.getInt(1));
                //board.setB_id(bid);도 가능함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
                board.setB_date(rs.getTimestamp(6));
                board.setB_hit(rs.getInt(7));
                board.setB_pwd(rs.getString(8));
                board.setB_ip(rs.getString(9));
                board.setB_ref(rs.getInt(10));//조회수는 INT이므로 getInt로 해야함
                board.setB_step(rs.getInt(11));
                board.setB_level(rs.getInt (12));
                board.setB_fname(rs.getString(13));
                board.setB_fsize(rs.getInt (14));
                board.setB_rfname(rs.getString(15));
//                
////                데이터가 제대로 들어갔는지 확인 해야함
                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
                System.out.println(&quot;@@@@#### board.getB_fname()=====&gt;&quot;+board.getB_fname());
                System.out.println(&quot;@@@@#### board.getB_fsize()=====&gt;&quot;+board.getB_fsize());
                System.out.println(&quot;@@@@#### board.getB_rfname()=====&gt;&quot;+board.getB_rfname());
                //System.out.println(&quot;@@@@#### board.setB_pwd()=====&gt;&quot;+board.setB_pwd(sql));
            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return board;
    }


    // 6.deleteBoard() 메소드 =&gt; 삭제할 글 비밀번호 확인하는 메소드 
    public int deleteBoard (int b_id, String b_pwd) throws Exception{//글번호만 넘기면 알아서 내용이 넘어가는 메소드 
        // id와 pwd를 받아 삭제하는 메소드 
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        int re = -1;


        String sql = &quot;&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
        String pwd = &quot;&quot;;//비밀번호 


        try {
            conn = getConnection();
            sql = &quot;SELECT B_PWD FROM BOARDT where B_ID=?&quot;; // 글 번호에 따른 비밀번호 가지고 오기
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
            pstmt.setInt(1, b_id);//값을 집어넣음(쿼리의 ?부분)
            rs = pstmt.executeQuery();

            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                pwd = rs.getString(1);
                //비밀번호를 
                if (pwd.equals(b_pwd)) {
                    sql = &quot;DELETE FROM BOARDT WHERE B_ID=?&quot;;
                    pstmt = conn.prepareStatement(sql);//pstmt객체로 쿼리를 받음
                    pstmt.setInt(1, b_id);
                    pstmt.executeUpdate();
                    re = 1;
                }else {
                    re =0;
                }

            }

        } catch(SQLException ex) {
             System.out.println(&quot;삭제 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
    }

    //7.테이블 수정 editBoard 메소드
        public int editBoard (BoardBean board) throws Exception{
            int re = -1;
            Connection conn = null;//데이터 베이스 접속
            PreparedStatement pstmt = null;// DB에 SQL 전달
            ResultSet rs = null;
            String sql =&quot;&quot;;
            String pwd = &quot;&quot;;//비밀번호 


            try {
                conn = getConnection();
                sql = &quot;SELECT B_PWD FROM BOARDT where B_ID=?&quot;; // 글 번호에 따른 비밀번호 가지고 오기
                pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
                pstmt.setInt(1, board.getB_id());//값을 집어넣음(쿼리의 ?부분),board 객체를 이용하여 b_id 가지고 오기
                rs = pstmt.executeQuery();

                if (rs.next()) {
                    pwd = rs.getString(1);

                    if  (pwd.equals(board.getB_pwd())) {
                        sql=&quot;UPDATE BOARDT \r\n&quot; + 
                                &quot;      SET B_NAME=?\r\n&quot; + 
                                &quot;        , B_EMAIL=?\r\n&quot; + 
                                &quot;        , B_TITLE=?\r\n&quot; + 
                                &quot;        , B_CONTENT=?\r\n&quot; + 
                                &quot;        WHERE B_ID=?&quot;;

                        pstmt = conn.prepareStatement(sql);//pstmt객체로 쿼리를 받음
                        pstmt.setString(1,board.getB_name());
                        pstmt.setString(2,board.getB_email());
                        pstmt.setString(3,board.getB_title());
                        pstmt.setString(4,board.getB_content());
                        pstmt.setInt(5, board.getB_id());
                        pstmt.executeUpdate();
                        re = 1;
                    }else {
                        re =0;//비밀번호가 같지 않은것
                    }
                }

            } catch(SQLException ex) {
                 System.out.println(&quot;수정 실패&quot;);
                 ex.printStackTrace();
              } finally {
                  try{//자원반납(순서 중요)
                      if(rs != null)  rs.close();
                      if(conn != null)  conn.close();
                      if(pstmt != null)  pstmt.close();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
              }
            return re;    
        }

        //8. 글번호를 넘겨서  b_fname, b_rfname를 사용하는 메소드
    public BoardBean getFileName(int bid) throws Exception{
            Connection conn = null;//데이터 베이스 접속
            PreparedStatement pstmt = null;// DB에 SQL 전달
            ResultSet rs = null;
            //db 정보 받기 위함
            BoardBean board = null;


            String sql = &quot;SELECT b_fname, b_rfname from BOARDT where b_id=?&quot;;

            try {
                conn = getConnection();

                pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//                 DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
                pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
                rs = pstmt.executeQuery();//select 문이니깐 익스큐트 쿼리

                if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                    board = new BoardBean();//객체생성(리턴값이 board)
                    board.setB_fname(rs.getString(1));// 파일명
                    board.setB_rfname(rs.getString(2));//진짜 파일명
                }
            } catch(SQLException ex) {
                 ex.printStackTrace();
              } finally {
                  try{//자원반납(순서 중요)
                      if(rs != null)  rs.close();
                      if(conn != null)  conn.close();
                      if(pstmt != null)  pstmt.close();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
              }
            return board;
        }
}</code></pre>
<h3 id="showjsp-1">show.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%    
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음    

    int bid = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    BoardDBBean db = BoardDBBean.getInstance();
    //BoardBean board = db.getBoard(bid);
    BoardBean board = db.getBoard(bid, true);
    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm&quot;);
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 내 용 보 기&lt;/h1&gt;
        &lt;table border=&quot;1&quot; width=&quot;600&quot; cellspacing=&quot;0&quot;&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글번호&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= bid %&gt;
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;조회수&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= board.getB_hit() %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;작성자&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= board.getB_name() %&gt;
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;작성일&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%-- &lt;%= board.getB_date() %&gt; --%&gt;
                    &lt;%= sdf.format(board.getB_date()) %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;110&quot;&gt;파&amp;nbsp;&amp;nbsp;일&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;center&quot; colspan=&quot;3&quot;&gt;
                    &amp;nbsp;
                    &lt;%--자료실 3 --%&gt;
                    &lt;%--
                    &lt;%
                        if(board.getB_fname() != null){ 
                    %&gt;
                             &lt;img src=&quot;../images/zip.gif&quot;&gt;
                             &lt;a href=&quot;../upload/&lt;%= board.getB_fname() %&gt;&quot;&gt;
                                    원본파일 : &lt;%= board.getB_fname() %&gt;
                             &lt;/a&gt;
                    &lt;%
                        }
                    %&gt;
                     --%&gt;

                     &lt;%--자료실 4 --%&gt;
                    &lt;%
                          out.print(&quot;&lt;p&gt;첨부파일&quot;+&quot;&lt;a href=&#39;FileDownload.jsp?fileN=&quot;+bid+&quot;&#39;&gt;&quot;+board.getB_rfname()+&quot;&lt;/a&gt;&lt;/p&gt;&quot;);
                    %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글제목&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;left&quot; colspan=&quot;3&quot;&gt;
                    &lt;%= board.getB_title() %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글내용&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;left&quot; colspan=&quot;3&quot;&gt; 
                    &lt;%= board.getB_content() %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td colspan=&quot;4&quot; align=&quot;right&quot;&gt;
                &lt;!--  페이지 목록에 맞춰야 해서 모두 쿼리스트링을 사용하여 pageNum=&lt;2%=pageNum%2&gt; 넣어야함 --&gt;
                    &lt;input type=&quot;button&quot; value=&quot;글수정&quot; onclick=&quot;location.href=&#39;edit.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;input type=&quot;button&quot; value=&quot;글삭제&quot; onclick=&quot;location.href=&#39;delete.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;input type=&quot;button&quot; value=&quot;답변글&quot; onclick=&quot;location.href=&#39;write.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;input type=&quot;button&quot; value=&quot;글목록&quot; onclick=&quot;location.href=&#39;list.jsp?pageNum=&lt;%=pageNum%&gt;&#39;&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="filedownloadjsp">FileDownload.jsp</h3>
<pre><code class="language-java">&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;java.io.BufferedOutputStream&quot;%&gt;
&lt;%@page import=&quot;java.io.FileInputStream&quot;%&gt;
&lt;%@page import=&quot;java.io.BufferedInputStream&quot;%&gt;
&lt;%@page import=&quot;java.io.File&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;

&lt;%
    //글 번호를 가지고 파일 정보를 가지고 올 거임
    int bid = Integer.parseInt(request.getParameter(&quot;fileN&quot;));//글번호
    //이부분 설명 놓침 뭔말이라고?
    BoardDBBean db = BoardDBBean.getInstance();
    BoardBean board = db.getFileName(bid); //board객체


    String fileName=&quot;&quot;;
    String realFileName=&quot;&quot;;
    if(board != null){
        fileName = board.getB_fname();
        realFileName = board.getB_fname();
    }

    String saveDirectory =  application.getRealPath(&quot;/upload&quot;);
    String path = saveDirectory + File.separator +fileName;

    File file = new File(path);//객체 생성
    long length = file.length();//file 객체에서 length사용시 용량? 이 됨
    new String(realFileName.getBytes(&quot;ms949&quot;),&quot;8859_1&quot;);    
    //리얼파일 네임을 인코딩


    response.setContentType(&quot;application/octet-stream&quot;);
    response.setContentLength((int)length);
    response.setHeader(&quot;Content-Disposition&quot;, &quot;attachment;filename=&quot; + realFileName);

    BufferedInputStream bis =  new BufferedInputStream(new FileInputStream(file));
    //bis객체를 읽어서 스트링

    out.clear();
    out = pageContext.pushBody();
    //남아 있는건 삭제

    //BufferedInputStream bos = new BufferedOutputStream(response.getOutputStream());
    BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
    int data;
    while((data=bis.read()) != -1){//라인을 받음 /EOF
            bos.write(data);
    }

    bis.close();
    bos.close();
%&gt;</code></pre>
<hr>
<h1 id="표현언어-ppt01">표현언어 PPT.01</h1>
<h2 id="표현언어expression-language의-기본">표현언어(Expression Language)의 기본</h2>
<p><strong>표현 언어의 표시형식</strong>
<code>&lt;%=expr%&gt; -&gt; ${expr}</code></p>
<ul>
<li>왜 나왔는가? 백엔드 프론트엔드 개발은 같이 함. 근데 JSP로 화면 구현시 프론트엔드 개발자는 보기 어려워함. (코딩은 같이 해야하는데 어찌 해야하는지 모름)</li>
<li><em>결론적으로 프론트엔드개발자들이 알수있는 형식으로 사용하는게 표현언어라고 생각하면 될 듯*</em></li>
</ul>
<p><strong>표현 언어의 데이터 타입</strong></p>
<ul>
<li>정수형, 실수형, 문자열형, 논리형</li>
</ul>
<h3 id="예제1">예제1</h3>
<p>  <img src="https://velog.velcdn.com/images/sofia_777/post/97e955ad-d1bb-4dcc-a88f-f1ad11a75dc2/image.png" alt=""></p>
<h4 id="elex01jsp">elEx01.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h3&gt;표현언어에서 사용 가능한 데이터&lt;/h3&gt;
    &lt;p&gt;[1] 정수형 : &lt;%= 10 %&gt; ====&gt; ${10} &lt;/p&gt;
    &lt;p&gt;[2] 실수형 : &lt;%= 5.6 %&gt; ====&gt; ${5.6} &lt;/p&gt;
    &lt;p&gt;[3] 문자열형 : &lt;%= &quot;홍길동&quot; %&gt; ====&gt; ${&quot;홍길동&quot;} &lt;/p&gt;
    &lt;p&gt;[3] 논리형 : &lt;%= true %&gt; ====&gt; ${true} &lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c621472c-9494-4283-8987-b9714bd4e8d8/image.png" alt=""></p>
<h1 id="표현언어-ppt02">표현언어 PPT.02</h1>
<h2 id="표현언어의-연산자">표현언어의 연산자</h2>
<blockquote>
<p><strong>1. 산술</strong>
+, -, <em>, /, % (or mod)
*</em>2. 관계형**
== (eq), != (ne), &lt; (lt), &gt; (gt), &lt;= (le), &gt;= (ge)
<strong>3. 조건</strong>
a?b:c (삼항연산자)
<strong>4. 논리</strong>
&amp;&amp; (and), || (or), ! (not)
<strong>5. 타당성검사</strong>
empty(비워져있는지 확인)</p>
</blockquote>
<h3 id="예제-2">예제 2</h3>
<h4 id="elex02jsp">elEx02.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
   pageContext.setAttribute(&quot;input&quot;, &quot;&quot;);
   pageContext.setAttribute(&quot;input2&quot;, &quot;bbb&quot;);
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h3&gt;[표현 언어의 연산자]&lt;/h3&gt;
    \${empty &quot;&quot;} ===&gt; ${empty &quot;&quot;}&lt;br&gt;&lt;!-- 비워있음 true --&gt;
    \${empty &quot;aaa&quot;} ===&gt; ${empty &quot;aaa&quot;}&lt;br&gt;&lt;!-- 비워있지 않음 false --&gt;
    \${empty input} ===&gt; ${empty input}&lt;br&gt;&lt;!-- input은 비워있음 true --&gt;
    \${empty input2} ===&gt; ${empty input2}&lt;br&gt;&lt;!-- input2은 비워있지 않음 false --&gt;


    &lt;br&gt;
    \${(5&gt;2) ? 5: 2} ===&gt; ${(5&gt;2) ? 5: 2}&lt;br&gt;
    &lt;!--삼항연산자 --&gt;
    \${2 gt 10} ===&gt; ${2 gt 10}&lt;br&gt;
    &lt;!-- 2가 10보다 크다. --&gt;
    &lt;br&gt;


    &lt;!-- 사칙연산 --&gt;
    \${5+2} ===&gt; ${5+2}&lt;br&gt;
    \${5/2} ===&gt; ${5/2}&lt;br&gt;
    \${5%2} ===&gt; ${5%2}&lt;br&gt;
    \${5 mod 2} ===&gt; ${5 mod 2}&lt;br&gt;


    &lt;br&gt;
    \${5 &gt; 2} ===&gt; ${5 &gt; 2}&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/41498fc2-95b4-4013-b94e-23b510d6395a/image.png" alt=""></p>
<h1 id="표현언어-ppt03">표현언어 PPT.03</h1>
<h2 id="액션-태그-대신-사용하는-표현-언어">액션 태그 대신 사용하는 표현 언어</h2>
<p><strong>JSP의 액션 태그</strong>
<code>&lt;jsp:getProperty name=&quot;user&quot; property=&quot;firstName&quot;/&gt;</code> <code>&lt;jsp:getProperty name=&quot;user&quot; property=&quot;lastName&quot;/&gt;</code></p>
<p>//각각 값을 가지고 와서 참조 변수의 값으로 생각함.(user 객체)</p>
<p><strong>표현 언어</strong>
<code>${user.firstName}</code> 
<code>${user.lastName}</code>
//자바에서 멤버변수로 참조하듯이 사용</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/01907a4c-9c7e-4a42-8383-e644fb7ecdf3/image.png" alt=""></p>
<h3 id="예제-3">예제 3</h3>
<h4 id="userjava">User.java</h4>
<pre><code class="language-java">package glory;

public class User {
    private String firstName=&quot;길동&quot;;
    private String lastName=&quot;홍&quot;;

    //getter,setter 추가
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    //getter,setter 추가 끝!



}</code></pre>
<h4 id="elex03jsp">elEx03.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h3&gt;[액션 태그와 표현 언어]&lt;/h3&gt;
    &lt;jsp:useBean class=&quot;glory.User&quot; id=&quot;user&quot;&gt;&lt;/jsp:useBean&gt;
    &lt;jsp:getProperty property=&quot;firstName&quot; name=&quot;user&quot;/&gt;
    &lt;jsp:getProperty property=&quot;lastName&quot; name=&quot;user&quot;/&gt;

    &lt;hr&gt;
    ${user.firstName} 
    ${user.lastName} 

    &lt;hr&gt;    
    &lt;jsp:setProperty property=&quot;firstName&quot; name=&quot;user&quot; value=&quot;Gildong&quot;/&gt;
    &lt;jsp:setProperty property=&quot;lastName&quot; name=&quot;user&quot; value=&quot;Hong&quot;/&gt;
    &lt;jsp:getProperty property=&quot;firstName&quot; name=&quot;user&quot;/&gt;
    &lt;jsp:getProperty property=&quot;lastName&quot; name=&quot;user&quot;/&gt;

    &lt;hr&gt;
    ${user.firstName} 
    ${user.lastName} 
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8bc077a4-9927-4e6a-8719-88708edf7ac7/image.png" alt=""></p>
<h1 id="표현언어-ppt04">표현언어 PPT.04</h1>
<h2 id="표현-언어의-내장-객체">표현 언어의 내장 객체</h2>
<p>*<em>📌requestScope    *</em>
request 기본 객체에 저장된 속성의 &lt;속성, 값&gt; 매핑을 저장한 Map 객체</p>
<p><strong>📌sessionScope</strong><br>session 기본 객체에 저장된 속성의 &lt;속성, 값&gt; 매핑을 저장한 Map 객체</p>
<p><strong>📌param</strong><br>요청 파라미터의 &lt;파라미터 이름, 값&gt; 매핑을 저장하는 Map 객체, 파라미터 값의 타입은 String으로서, request.getParameter(이름)의 결과와 동일하다.</p>
<p>*<em>📌cookie    *</em>
&lt;쿠키 이름, Cookie&gt; 매핑을 저장하는 Map 객체, request.getCookies()로 구한 Cookie 배열로부터 매핑을 생성한다.</p>
<h2 id="표현-언어의-내장-객체와-접근자">표현 언어의 내장 객체와 접근자</h2>
<ol>
<li><p>표현 언어는  닷(dot) 연산자(.)와 브라켓 연산자([]) 두 개의 접근자를 제공한다.
닷 연산자는 객체의 속성에 접근하는데 사용된다.
<code>${[requestScope.name]</code></p>
</li>
<li><p>브라켓 연산자안의 값인 속성의 이름은 큰따옴표(&quot;) 혹은 작은따옴표(&#39;)로 둘러싸야 한다.<br><code>${requestScope[&quot;name&quot;]}</code></p>
</li>
</ol>
<h3 id="예제-4">예제 4</h3>
<h4 id="elex04jsp">elEx04.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    request.setAttribute(&quot;name&quot;, &quot;홍길동&quot;);
%&gt;    

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h3&gt;JSP 표현 &lt;/h3&gt;
    &lt;%= request.getAttribute(&quot;name&quot;) %&gt;
    &lt;hr&gt;

    &lt;h3&gt;[표현 언어와 내장 객체와 접근자]&lt;/h3&gt;
    &lt;h4&gt;닷 연산자로 접근&lt;/h4&gt;
    ${requestScope.name}

    &lt;h4&gt;브라켓 연산자로 접근&lt;/h4&gt;
    ${requestScope[&quot;name&quot;]}
    &lt;br&gt;
    ${requestScope[&#39;name&#39;]}


&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ec04c4af-8db9-42f8-b690-98958669f3bc/image.png" alt=""></p>
<hr>
<h1 id="jstl">JSTL</h1>
<h2 id="jstl의-개요">JSTL의 개요</h2>
<p>** JSTL( JSP Standard Tag Library)**</p>
<pre><code>   사용자 정의 태그의 표준
  if, for, while, 데이터베이스 처리
  내장 객체, 파라미터, 헤더, 쿠키 쉽게 사용
  객체 간의 비교를 ==와 같은 간단한 연산자로 구현</code></pre><h2 id="jstl이-제공하는-태그의-종류와-사용법">JSTL이 제공하는 태그의 종류와 사용법</h2>
<p><strong>JSTL이 제공하는 태그의 종류</strong>
<img src="https://velog.velcdn.com/images/sofia_777/post/e9a7511a-5fce-4c08-9bc4-bb64c949cc93/image.png" alt=""></p>
<p><strong>JSTL이 제공하는 태그 사용</strong>
JSP 페이지에 &lt;%@ taglib&gt; 디렉티브 태그를 사용
<img src="https://velog.velcdn.com/images/sofia_777/post/25b814ec-20dd-4f6d-9898-e2f416602cf9/image.png" alt="">
  jstl.jar 파일이 필요</p>
<p><strong>Jstl jar 파일이 없을때</strong></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8f5db4c2-93eb-40bf-ac60-06aefcdfe9c6/image.png" alt=""></p>
<h2 id="core-태그">Core 태그</h2>
<p>Core 태그의 종류</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/21faa8f8-b7e9-438a-a609-29956b91b3e5/image.png" alt=""></p>
<h3 id="예제-5">예제 5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/74167927-3bd8-41a4-ac1f-1df2fc178bec/image.png" alt=""></p>
<p><a href="https://mvnrepository.com/artifact/javax.servlet/jstl/1.2">https://mvnrepository.com/artifact/javax.servlet/jstl/1.2</a>
  에 접속해서 jar 다운받기</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/409db809-2b6b-425f-91b0-2c19793fea25/image.png" alt=""></p>
<p>그후 사진과 같이 jar파일 넣기
  <img src="https://velog.velcdn.com/images/sofia_777/post/94de0a22-f0f4-4ec1-9b7e-14379b109dca/image.png" alt=""></p>
<h4 id="core01jsp">core01.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt; 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    id 변수값 설정
    &lt;c:set var=&quot;id&quot; value=&quot;aaa&quot;&gt;&lt;/c:set&gt;&lt;br&gt;
    &lt;c:out value=&quot;${id}&quot;&gt;&lt;/c:out&gt;
    &lt;br&gt;&lt;br&gt;

    id 변수값 삭제
    &lt;c:remove var=&quot;id&quot;/&gt;&lt;br&gt;
    &lt;c:out value=&quot;${id}&quot;&gt;&lt;/c:out&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ca290bc5-beec-4b53-9d88-0b08ba3f6f76/image.png" alt=""></p>
<h4 id="core02jsp">core02.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt; 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form method=&quot;post&quot; action=&quot;core02_process.jsp&quot;&gt;
        &lt;p&gt;
            숫자 : &lt;input type=&quot;text&quot; name=&quot;number&quot;&gt;
        &lt;/p&gt;
        &lt;p&gt;
            &lt;input type=&quot;submit&quot; value=&quot;전송&quot;&gt;
        &lt;/p&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="core02_processjsp">core02_process.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
    &lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt; 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%
        String number = request.getParameter(&quot;number&quot;);
    %&gt;

    &lt;c:set var=&quot;number&quot; value=&quot;&lt;%= number %&gt;&quot;&gt;&lt;/c:set&gt;
    &lt;c:choose&gt;
        &lt;c:when test=&quot;${number % 2 == 0 }&quot;&gt;
            &lt;c:out value=&quot;${number}&quot;&gt;&lt;/c:out&gt;은 짝수입니다.
        &lt;/c:when&gt;
        &lt;c:when test=&quot;${number % 2 == 1 }&quot;&gt;
            &lt;c:out value=&quot;${number}&quot;&gt;&lt;/c:out&gt;은 홀수입니다.
        &lt;/c:when&gt;
    &lt;/c:choose&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>  <img src="https://velog.velcdn.com/images/sofia_777/post/17f4a6c8-892e-403d-af59-515f431fc68d/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/sofia_777/post/40324675-b6a3-46e6-9531-d16abaea5e46/image.png" alt=""></p>
<h4 id="core03jsp">core03.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt; 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h3&gt;구구단&lt;/h3&gt;
    &lt;table&gt;
        &lt;c:forEach var=&quot;i&quot; begin=&quot;1&quot; end=&quot;9&quot;&gt;
            &lt;tr&gt;
                &lt;c:forEach var=&quot;j&quot; begin=&quot;1&quot; end=&quot;9&quot;&gt;
                    &lt;td    width=&quot;100&quot;&gt;
                        ${i}*${j}=${i*j}
                    &lt;/td&gt;
                &lt;/c:forEach&gt;
            &lt;/tr&gt;
        &lt;/c:forEach&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>  <img src="https://velog.velcdn.com/images/sofia_777/post/4344f65f-dd33-4c18-a200-b61d6e07fbb2/image.png" alt=""></p>
<p>  <strong>2.2 SQL 태그 
  SQL 태그의 종류</strong>
<img src="https://velog.velcdn.com/images/sofia_777/post/4053383d-19eb-459d-955a-78a8c398f46f/image.png" alt=""></p>
<p><strong>2.3 Functions 태그
Functions 태그의 종류</strong></p>
<p>  <img src="https://velog.velcdn.com/images/sofia_777/post/18a839a1-c865-491f-b602-e12b82052531/image.png" alt=""></p>
<h4 id="function01jsp">function01.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&quot; %&gt; 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;p&gt;java 문자열 검색&lt;/p&gt;
    &lt;p&gt;Hello, Java Server Pages! =&gt; ${fn:contains(&quot;Hello, Java Server Pages!&quot;,&quot;java&quot;)}&lt;/p&gt;
    &lt;p&gt;Hello, Java Server Pages! =&gt; ${fn:contains(&quot;Hello, Java Server Pages!&quot;,&quot;Java&quot;)}&lt;/p&gt;
    &lt;!-- 대소문자 구별함 --&gt;

    &lt;br&gt;&lt;br&gt;
    &lt;p&gt;Hello, Java Server Pages! =&gt; ${fn:containsIgnoreCase(&quot;Hello, Java Server Pages!&quot;,&quot;java&quot;)}&lt;/p&gt;
    &lt;p&gt;Hello, Java Server Pages! =&gt; ${fn:containsIgnoreCase(&quot;Hello, Java Server Pages!&quot;,&quot;Java&quot;)}&lt;/p&gt;
    &lt;!-- 대소문자 구별하지 않음 --&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>  <img src="https://velog.velcdn.com/images/sofia_777/post/d3ae103b-d4b0-4f47-91aa-363792ad42c5/image.png" alt=""></p>
<h4 id="function02jsp">function02.jsp</h4>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&quot; %&gt; 
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt; 
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;c:set var=&quot;texts&quot; value=&quot;${fn:split(&#39;Hello, Java Server Pages!&#39;,&#39; &#39;)}&quot;&gt;&lt;/c:set&gt;
    &lt;c:forEach var=&quot;i&quot; begin=&quot;0&quot; end=&quot;${fn:length(texts) - 1}&quot;&gt;
        &lt;p&gt;
            texts[${i}] =  ${texts[i]}
        &lt;/p&gt;
    &lt;/c:forEach&gt;

    &lt;p&gt;
        &lt;c:out value=&quot;${fn:join(texts,&#39;-&#39;)}&quot;&gt;&lt;/c:out&gt;
    &lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>  <img src="https://velog.velcdn.com/images/sofia_777/post/45a5fd2a-df73-4015-a778-b219e7d0e152/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.09.05~08]]></title>
            <link>https://velog.io/@sofia_777/2022.09.0508</link>
            <guid>https://velog.io/@sofia_777/2022.09.0508</guid>
            <pubDate>Mon, 12 Sep 2022 16:40:22 GMT</pubDate>
            <description><![CDATA[<ul>
<li>게시판은 날마다 다시 수정 및 추가하면서 설명 할 예정임......
작성 순서는 강사님이 제공한 ppt참고해야하며 
날 마다 업데이트를 하다보니, 도중에 오류 발생하거나 백업이 안된 경우(믿었던 백업에 배신당하기!)가 있었으므로, 전체 코드를 jsp,java 파일 별로 믿에 둘 거임.</li>
</ul>
<hr>
<p>집에서 수정하다보니 처음 보는 오류들이 많이 발생함. </p>
<p>최대한 코드 수정한걸 복사하고 붙어넣어서 최대한 이상이 안생기도록 할것.
(파일 삭제후, 붙어넣기하니깐 오류 발생함. 내용 전체를 컨트롤 c,v 해야함)</p>
<hr>
<h1 id="게시판">게시판</h1>
<h2 id="sql">SQL</h2>
<pre><code class="language-sql">CREATE TABLE BOARDT
(B_ID NUMBER(5) PRIMARY KEY
,B_NAME VARCHAR2(20)
,B_EMAIL VARCHAR2(50)
,B_TITLE VARCHAR2(80)
,B_CONTENT VARCHAR2(3000)
,B_DATE DATE
,B_HIT NUMBER(5) DEFAULT 0
,B_PWD VARCHAR2(12)
,B_IP VARCHAR2(15)
,B_REF NUMBER(5)
,B_STEP NUMBER(5)
,B_LEVEL NUMBER(5)
);</code></pre>
<h2 id="1-boardbeanjava">1. BoardBean.java</h2>
<pre><code class="language-java">package magic.board;

import java.sql.Timestamp;

public class BoardBean {
    private int b_id;
    private String b_name;
    private String b_email;
    private String b_title;
    private String b_content;
    private Timestamp b_date;
    private int b_hit;
    private String b_pwd;
    private String b_ip;
    private int b_ref;
    private int b_step;
    private int b_level;


    public int getB_ref() {
        return b_ref;
    }
    public void setB_ref(int b_ref) {
        this.b_ref = b_ref;
    }
    public int getB_step() {
        return b_step;
    }
    public void setB_step(int b_step) {
        this.b_step = b_step;
    }
    public int getB_level() {
        return b_level;
    }
    public void setB_level(int b_level) {
        this.b_level = b_level;
    }
    public String getB_ip() {
        return b_ip;
    }
    public void setB_ip(String b_ip) {
        this.b_ip = b_ip;
    }
    public String getB_pwd() {
        return b_pwd;
    }
    public void setB_pwd(String b_pwd) {
        this.b_pwd = b_pwd;
    }
    public int getB_id() {
        return b_id;
    }
    public void setB_id(int b_id) {
        this.b_id = b_id;
    }
    public String getB_name() {
        return b_name;
    }
    public void setB_name(String b_name) {
        this.b_name = b_name;
    }
    public String getB_email() {
        return b_email;
    }
    public void setB_email(String b_email) {
        this.b_email = b_email;
    }
    public String getB_title() {
        return b_title;
    }
    public void setB_title(String b_title) {
        this.b_title = b_title;
    }
    public String getB_content() {
        return b_content;
    }
    public void setB_content(String b_content) {
        this.b_content = b_content;
    }
    public Timestamp getB_date() {
        return b_date;
    }
    public void setB_date(Timestamp b_date) {
        this.b_date = b_date;
    }

    public int getB_hit() {
        return b_hit;
    }
    public void setB_hit(int b_hit) {
        this.b_hit = b_hit;
    }

    //================ 페이지 목록 ===================

    public static int pageSize =10; //한페이지에 10개의 글을 보여주기 위한 변수
    public static int pageCount = 1; //페이지 개수 카운트, 페이지(컬럼)가 많을 수록 늘어남(초기값)
    public static int pageNum = 1; //페이지 번호(기본값)

    //이부분 정리 다시 해서 노션에 정리하기

    // 84건의 게시글 존재 
    //=&gt; pageCount = 9 
    //pageNum = 1
    //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
    //temp = 0 // (pageNum -1) % limit;
    //startPage = 1 //pageNum(1) - temp(0)

    //if(1-4&gt;0) 거짓
    //for(int i = 1; i&lt;5; i++){
    //    if(1=1)(참) str=[1]
    //    if(1&gt;=9)(거짓) 
    //    }
    //for(int 2 = 1; i&lt;5; i++){
    //    if(2=1) 거짓
    //    else{str=[1]+ [2] //1은 링크가 걸리지 않고 2는 링크가 걸림 
    //  if(2&gt;=9)(거짓) 
    //    }
    //for(int 3 = 1; i&lt;5; i++){
        //    if(3=1) 거짓
        //    else{str=[1]+ [2] +[3]//3에 링크 걸림
        //  if(3&gt;=9)(거짓) 
        //    }
    //for(int 4 = 1; 4&lt;5; i++){
    //    if(4=1) 거짓
    //    else{str=[1]+ [2] + [3] + [4]//4에 링크 걸림
    //  if(4&gt;=9)(거짓) 
    //    }

    //if (5&lt;= 9){ 5[다음]
    //   
    //}


    // 최종적으로 [1]+[2]+[3]+[4]+ 다음 


    //===============================
    // 84건의 게시글 존재 
        //=&gt; pageCount = 9 
        //pageNum = 1
        //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
        //temp = 0 // (pageNum -1) % limit;
        //startPage = 1 //pageNum(1) - temp(0)

        //if(1-4&gt;0) 거짓
        //for(int i = 1; i&lt;5; i++){
            //    if(1=1)(참) str=[1]
            //    if(1&gt;=9)(거짓) 
        //    }
        //for(int 2 = 1; i&lt;5; i++){
            //    if(2=1) 거짓
            //    else{str= [1]+ [2] //1은 링크가 걸리지 않고 2는 링크가 걸림 
            //  if(2&gt;=9)(거짓) 
        //    }
        //for(int 3 = 1; i&lt;5; i++){
            //    if(3=1) 거짓
            //    else{str=[1]+ [2] +[3]//3에 링크 걸림
            //  if(3&gt;=9)(거짓) 
            //    }
        //for(int 4 = 1; 4&lt;5; i++){
            //    if(4=1) 거짓
            //    else{str=[1]+ [2] + [3] + [4]//4에 링크 걸림
            //  if(4&gt;=9)(거짓) 
        //    }

        //if (5&lt;= 9){ 5[다음]
        //   
        //}


        // 최종적으로 [1]+[2]+[3]+[4]+ 다음 


    // 84건의 게시글 존재 
        //=&gt; pageCount = 9 
        //pageNum = 5
        //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
        //temp = 0 // (pageNum -1) % limit;
        //startPage = 5 //pageNum(5) - temp(0)

        //if(5-4&gt;0) 참 {[이전4]}

        //for(int i = 5; i&lt;9; i++){
            //    if(5=5)(참) str=[이전 4]+[5] : 두개 다 링크 걸려있음
            //    if(5&gt;=9)(거짓) 
        //    }
        //for(int i = 6; i&lt;9; i++){
            //    if(6=1) 거짓
            //    else{str= [이전4]+[5]+[6] //6은 링크가 걸림 
            //  if(6&gt;=9)(거짓) 
        //    }
        //for(int i = 7; i&lt;9; i++){
                //    if(7=5) 거짓
                //    else{str=[이전4]+[5]+[6]+[7]
                //  if(7&gt;=9)(거짓) 
            //    }
        //for(int i = 8; i&lt;9; i++){
            //    if(7=1) 거짓
            //    else{str=[이전4]+[5]+[6]+[7]+[8]
            //  if(3&gt;=9)(거짓) 
        //    }

        //if (9&lt;= 9){ 9[다음]
        //   
        //}


        // 최종적으로 [이전 4]+[5]+[6]+[7]+[8]+ [다음 9]

        // 84건의 게시글 존재 
        //pageCount = 9 
        //pageNum = 9
        //limit = 4(사진에서 목록중 숫자가 몇개 있는가? 1,2,3,4 =&gt; 5,6,7,8 =&gt;9 이런 순으로 목록이 적혀 있음
        //temp = 0 // (pageNum -1) % limit;
        //startPage = 9 //pageNum(9) - temp(0)

        //if(9-4&gt;0) 참 {[이전8]}
            //for(int i = 9; i&lt;13; i++){
            //    if(9=9)(참) str=[이전 8]+[9] : 두개 다 링크 걸려있음
            //    if(9&gt;=9)참
            //    }
            //if(13&lt;=9)거짓 
        //   
        //}

        //최종적으로 [이전 8]+[9]
    //=============

    public static String pageNumber(int limit) {
        //페이지 목록들을 만들어 주는 메소드
        //int limit -&gt; 몇개의 페이지에 대한 로직을 처리할것인지 설정

        String str =&quot;&quot;;
        int temp = (pageNum -1) % limit;//시작 페이지를 구함
        int startPage = pageNum - temp; // 시작페이지 설정 &quot;1 - 0 = 1&quot; 이기 때문에 1이 됨

        if((startPage - limit) &gt; 0) {//[이전]을 구현하기 위한 if문
            //limit 4, temp 0 , startPage 1이라고 가정했을때
            //if((1-4)&gt;0)
            //pageNum = 5 인경우 =&gt; startPage 5
            //if((5-4) &gt;0 ) =&gt; 참 

            str =&quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+(startPage-1)+&quot;&#39;&gt;[이전]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;
            //str = [이전]


        }


        for (int i = startPage; i &lt; (startPage+limit); i++) {
            //페이지 번호가 몇개인지 모름. 즉 페이지 번호를 나열할 필요가 있음

            //for(i = 1; i &lt; 5; i++) - &gt;4까지 나옴
            //pageNum = 5인경우 for(i= 5; i&lt;9;i++)

            if (i == pageNum) {
                //i = 1 이면 링크가 걸리지 않음
                str += &quot;[&quot;+i+&quot;]&amp;nbsp;&amp;nbsp;&quot;;
                //str = [1]
            }else {
                str += &quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+i+&quot;&#39;&gt;[&quot;+i+&quot;]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;
            }

            if (i &gt;= pageCount) {
                break;
            }
        }

        if((startPage + limit) &lt;= pageCount) {//[다음]을 구현하기 위한 if문

            str +=&quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+(startPage+limit)+&quot;&#39;&gt;[다음]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;

//            str = &quot;&lt;a href=&#39;list.jsp?pageNum=&quot;+(startPage-1)+&quot;&#39;&gt;[이전]&lt;/a&gt;&amp;nbsp;&amp;nbsp;&quot;;
            //str = [이전]
        }
        return str;
    }

}</code></pre>
<h2 id="2boarddbbeanjava">2.BoardDBBean.java</h2>
<pre><code class="language-java">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


//    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
     public int insertBoard(BoardBean board) throws Exception {
          int re = -1;
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          String sql = &quot;&quot;;
          int number;

          //게시판 2-1 
//          답변글을 위한 변수
          int id = board.getB_id();
          int ref = board.getB_ref();
          int step = board.getB_step();
          int level = board.getB_level();


          try {
             conn = getConnection();
             sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;//글번호 추가
             pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
             rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

             if (rs.next()) {//다음 쿼리 데이터가 있는 경우를 조건문으로 줌.
                number = rs.getInt(1)+1;
              //글번호가 가장 큰 값을 조회하여 1증가 한 값을 INSERT쿼리에 추가
             } else { 
                number = 1;
             }

//             id가 값이 있거나 0이거나 둘 중 하나가 될 수 있다. 0 일때는 새글, 0이 아닐 때는 답변글
             if (id != 0) { //답변글일 때(id가 0이 아니면 답글로 봄)
//                update문이 핵심
                sql = &quot;UPDATE BOARDT SET b_step = b_step+1 WHERE b_ref=? AND b_step&gt;?&quot;;
                //부모글을 찾아 그중에서 현재글(원부모글)보다 b_step이 큰 글들을 찾아서 부모글들의 b_step값을 모두 1씩 더함
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, ref);//값을 세팅(넣어줌)(위에서 변수로 받은 ref를 받음)
                pstmt.setInt(2, step);//(위에서 변수로 받은 step를 받음)값을 세팅(넣어줌)
                pstmt.executeUpdate();//update문(쿼리)
                step = step + 1;//답글
                level = level + 1;
             } else { //답변글이 아닐 때=새글
                ref = number;
                step = 0;
                level = 0;
             }

//             System.out.println(&quot;@@@### board.number ===&gt; &quot;+number);
//             System.out.println(&quot;@@@### board.getB_name() ===&gt; &quot;+board.getB_name());
//             System.out.println(&quot;@@@### board.getB_email() ===&gt; &quot;+board.getB_email());
//             System.out.println(&quot;@@@### board.getB_title() ===&gt; &quot;+board.getB_title());
//             System.out.println(&quot;@@@### board.getB_content() ===&gt; &quot;+board.getB_content());
//             System.out.println(&quot;@@@### board.getB_date() ===&gt; &quot;+board.getB_date());
//             System.out.println(&quot;@@@### board.getB_pwd() ===&gt; &quot;+board.getB_pwd());
//             System.out.println(&quot;@@@### board.getB_ip() ===&gt; &quot;+board.getB_ip());

//             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?)&quot;;
             sql = &quot;INSERT INTO BOARDT VALUES(?,?,?,?,?,?,?,?,?,?,?,?)&quot;;
             pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언

//             데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### number=====&gt;&quot;+number);
//                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
//                System.out.println(&quot;@@@@#### board.getB_date()=====&gt;&quot;+board.getB_date());
//                System.out.println(&quot;@@@@#### board.getB_hit()=====&gt;&quot;+board.getB_hit());
//                System.out.println(&quot;@@@@#### board.getB_pwd()=====&gt;&quot;+board.getB_pwd());
//                System.out.println(&quot;@@@@#### board.getB_ip()=====&gt;&quot;+board.getB_ip());
//                System.out.println(&quot;@@@@#### board.getB_ref()=====&gt;&quot;+board.getB_ref());
//                System.out.println(&quot;@@@@#### board.getB_step()=====&gt;&quot;+board.getB_step());
//                System.out.println(&quot;@@@@#### board.getB_level()=====&gt;&quot;+board.getB_level());
//                

//                //변수 값 담기
             pstmt.setInt(1, number);//인덱스 번호 변경 및 글번호 (number) 추가
             pstmt.setString(2, board.getB_name());
             pstmt.setString(3, board.getB_email());
             pstmt.setString(4, board.getB_title());
             pstmt.setString(5, board.getB_content());
             pstmt.setTimestamp(6, board.getB_date());//날짜 및 시간 저장한걸 추가(setTimestamp)
             pstmt.setInt(7, board.getB_hit());
             pstmt.setString(8, board.getB_pwd());
             pstmt.setString(9, board.getB_ip());
             pstmt.setInt(10, ref);
             pstmt.setInt(11, step);
             pstmt.setInt(12, level);
             pstmt.executeUpdate();

             re = 1;
//             re = pstmt.executeUpdate();
          }  catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
             try {//자원반납(순서 중요)
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
             } catch(Exception e) {
                e.printStackTrace();
             }
          }

          return re;
       }

    //4. 리턴타입이 ArrayList&lt;BoardBean&gt; 인 listBoard() 메소드 추가(글목록을 위한 메소드)
    public ArrayList&lt;BoardBean&gt; listBoard(String pageNumber) throws Exception{//제네릭 사용함 , 파라미터는 BoardBean

        Connection conn = null;//데이터 베이스 접속
        Statement stmt = null;// DB에 SQL 전달
        int dbCount = 0;//글이 몇개나 있는지 확인(게시글의 갯수
        int absoultepage = 0;//글이 몇개나 있는지 확인(게시글의 갯수
        ResultSet rs = null;
        ResultSet pageSet = null;


        //db 정보 받기 위함
        String sql=&quot; SELECT b_id \r\n&quot; + 
                &quot;     , b_name\r\n&quot; + 
                &quot;     , b_email\r\n&quot; + 
                &quot;     , b_title\r\n&quot; + 
                &quot;     , b_content\r\n&quot; + 
                &quot;     , b_date\r\n&quot; + 
                &quot;     , b_hit\r\n&quot; + 
                &quot;     , b_pwd\r\n&quot; + 
                &quot;     , b_ip\r\n&quot; + 
                &quot;     , b_ref\r\n&quot; + 
                &quot;     , b_step\r\n&quot; + 
                &quot;     , b_level\r\n&quot; + 
                &quot;  FROM BOARDT\r\n&quot; + 
                &quot; ORDER BY b_ref desc, b_step asc&quot;;//해당 데이터 쿼리 정렬되게끔 함.



        String sql2=&quot;SELECT COUNT(b_id) FROM BOARDT&quot;;



        ArrayList&lt;BoardBean&gt; boardList = new ArrayList&lt;BoardBean&gt;();//ArrayList로 게시글들을 받음

        try {
            conn = getConnection();
//            stmt = conn.createStatement();// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            // 매개변수 (,변경전 내용을 저장하겠다.)
            // DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pageSet = stmt.executeQuery(sql2);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(pageSet.next()) {
                dbCount = pageSet.getInt(1);
                pageSet.close();
            }

            if (dbCount % BoardBean.pageSize == 0) { //pageCount 세팅(페이지 개수를 알려주기 위해 사용)
                //80 % 10 = 0
                BoardBean.pageCount = dbCount / BoardBean.pageSize; //80 /10
            } else {//84 % 10 = 4
                BoardBean.pageCount = dbCount / BoardBean.pageSize +1 ; //80/10 +1
            }


            if (pageNumber != null) {
                BoardBean.pageNum = Integer.parseInt(pageNumber); //매개변수에 해당되는 pageNumber 세팅
                absoultepage = (BoardBean.pageNum - 1) * BoardBean.pageSize + 1;
            }

            rs = stmt.executeQuery(sql);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if (rs.next()) {//while문을 감쌈
                rs.absolute(absoultepage);
                int count = 0;

                while(count &lt; BoardBean.pageSize) {//pageSize수 (10번) 만큼  반복
                    //다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.

                    BoardBean board = new BoardBean();
                    //결과값을 세팅
                    board.setB_id(rs.getInt(1));//아이디는 INT이므로 getInt로 해야함
                    board.setB_name(rs.getString(2));
                    board.setB_email(rs.getString(3));
                    board.setB_title(rs.getString(4));
                    board.setB_content(rs.getString(5));
                    board.setB_date(rs.getTimestamp(6));
                    board.setB_hit(rs.getInt(7));//조회수는 INT이므로 getInt로 해야함
                    board.setB_pwd(rs.getString(8));//조회수는 INT이므로 getInt로 해야함
                    board.setB_ip(rs.getString(9));//조회수는 INT이므로 getInt로 해야함
                    board.setB_ref(rs.getInt(10));//조회수는 INT이므로 getInt로 해야함
                    board.setB_step(rs.getInt(11));//조회수는 INT이므로 getInt로 해야함
                    board.setB_level(rs.getInt (12));//조회수는 INT이므로 getInt로 해야함

    //                데이터가 제대로 들어갔는지 확인 해야함
    //                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
    //                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
    //                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
    //                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
    //                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
    //                System.out.println(&quot;@@@@#### board.getB_pwd()=====&gt;&quot;+board.getB_pwd());
    //                System.out.println(&quot;@@@@####&quot;);

                    boardList.add(board);//반복하면서 게시글들을 쌓음

                    if (rs.isLast()) {//결과값이 마지막이면 빠져나오기
                        break;
                    } else {
                        rs.next();//마지막이 아니면 계속 진행
                    }

                    count++;
                }

            }
        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(stmt != null)  stmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return boardList;
    }


    // 5. 리턴타입이 BoardBean인 getBoard() 메소드 추가
    public BoardBean getBoard (int bid, boolean hitadd) throws Exception{
        //글번호만 넘기면 알아서 내용이 넘어가는 메소드
        //조회 수 때문에 분기처리  해가

        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        PreparedStatement pstmtup = null;// 조회수 업데이트
        ResultSet rs = null;
        //db 정보 받기 위함
        BoardBean board = null;
        String sql = &quot;&quot;;//해당 번호의 데이터 출력되게 쿼리 작성

        try {
            conn = getConnection();
            if (hitadd==true) {
                //조회수 업데이트 추가함
                sql = &quot;UPDATE BOARDT SET b_hit=b_hit+1 WHERE b_id=?&quot;;
                pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
                pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
//            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리
                pstmt.executeUpdate();//업데이트니깐 업데이트로 바꿔줌
                //pstmtup.close();
                //업데이트 추가 끝!
            }

            sql = &quot;SELECT b_id\r\n&quot; + 
                    &quot;    , b_name\r\n&quot; + 
                    &quot;    , b_email\r\n&quot; + 
                    &quot;    , b_title\r\n&quot; + 
                    &quot;    , b_content\r\n&quot; + 
                    &quot;    , b_date\r\n&quot; + 
                    &quot;    , b_hit\r\n&quot; + 
                    &quot;    , b_pwd\r\n&quot; + 
                    &quot;    , b_ip\r\n&quot; + 
                    &quot;    , b_ref\r\n&quot; + 
                    &quot;    , b_level\r\n&quot; + 
                    &quot;    , b_step\r\n&quot; + 
                    &quot; FROM BOARDT\r\n&quot; + 
                    &quot; WHERE b_id=?&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
            rs = pstmt.executeQuery();//select 문이니깐 익스큐트 쿼리


            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                board = new BoardBean();//객체생성(리턴값이 board)
                board.setB_id(rs.getInt(1));
                //board.setB_id(bid);도 가능함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
                board.setB_date(rs.getTimestamp(6));
                board.setB_hit(rs.getInt(7));
                board.setB_pwd(rs.getString(8));
                board.setB_ip(rs.getString(9));
                board.setB_ref(rs.getInt(10));//조회수는 INT이므로 getInt로 해야함
                board.setB_step(rs.getInt(11));//조회수는 INT이므로 getInt로 해야함
                board.setB_level(rs.getInt (12));//조
//                
////                데이터가 제대로 들어갔는지 확인 해야함
                System.out.println(&quot;@@@@#### board.setB_id()=====&gt;&quot;+board.getB_id());
                System.out.println(&quot;@@@@#### board.setB_name()=====&gt;&quot;+board.getB_name());
                System.out.println(&quot;@@@@#### board.setB_email()=====&gt;&quot;+board.getB_email());
                System.out.println(&quot;@@@@#### board.setB_title()=====&gt;&quot;+board.getB_title());
                System.out.println(&quot;@@@@#### board.setB_content()=====&gt;&quot;+board.getB_content());
                //System.out.println(&quot;@@@@#### board.setB_pwd()=====&gt;&quot;+board.setB_pwd(sql));
            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return board;
    }


    // 6.deleteBoard() 메소드 =&gt; 삭제할 글 비밀번호 확인하는 메소드 
    public int deleteBoard (int b_id, String b_pwd) throws Exception{//글번호만 넘기면 알아서 내용이 넘어가는 메소드 
        // id와 pwd를 받아 삭제하는 메소드 
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        int re = -1;


        String sql = &quot;&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
        String pwd = &quot;&quot;;//비밀번호 


        try {
            conn = getConnection();
            sql = &quot;SELECT B_PWD FROM BOARDT where B_ID=?&quot;; // 글 번호에 따른 비밀번호 가지고 오기
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
            pstmt.setInt(1, b_id);//값을 집어넣음(쿼리의 ?부분)
            rs = pstmt.executeQuery();

            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                pwd = rs.getString(1);
                //비밀번호를 
                if (pwd.equals(b_pwd)) {
                    sql = &quot;DELETE FROM BOARDT WHERE B_ID=?&quot;;
                    pstmt = conn.prepareStatement(sql);//pstmt객체로 쿼리를 받음
                    pstmt.setInt(1, b_id);
                    pstmt.executeUpdate();
                    re = 1;
                }else {
                    re =0;
                }

            }

        } catch(SQLException ex) {
             System.out.println(&quot;삭제 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
    }

    //7.테이블 수정 editBoard 메소드
        public int editBoard (BoardBean board) throws Exception{
            int re = -1;
            Connection conn = null;//데이터 베이스 접속
            PreparedStatement pstmt = null;// DB에 SQL 전달
            ResultSet rs = null;
            String sql =&quot;&quot;;
            String pwd = &quot;&quot;;//비밀번호 


            try {
                conn = getConnection();
                sql = &quot;SELECT B_PWD FROM BOARDT where B_ID=?&quot;; // 글 번호에 따른 비밀번호 가지고 오기
                pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
                pstmt.setInt(1, board.getB_id());//값을 집어넣음(쿼리의 ?부분),board 객체를 이용하여 b_id 가지고 오기
                rs = pstmt.executeQuery();

                if (rs.next()) {
                    pwd = rs.getString(1);

                    if  (pwd.equals(board.getB_pwd())) {
                        sql=&quot;UPDATE BOARDT \r\n&quot; + 
                                &quot;      SET B_NAME=?\r\n&quot; + 
                                &quot;        , B_EMAIL=?\r\n&quot; + 
                                &quot;        , B_TITLE=?\r\n&quot; + 
                                &quot;        , B_CONTENT=?\r\n&quot; + 
                                &quot;        WHERE B_ID=?&quot;;

                        pstmt = conn.prepareStatement(sql);//pstmt객체로 쿼리를 받음
                        pstmt.setString(1,board.getB_name());
                        pstmt.setString(2,board.getB_email());
                        pstmt.setString(3,board.getB_title());
                        pstmt.setString(4,board.getB_content());
                        pstmt.setInt(5, board.getB_id());
                        pstmt.executeUpdate();
                        re = 1;
                    }else {
                        re =0;//비밀번호가 같지 않은것
                    }
                }

            } catch(SQLException ex) {
                 System.out.println(&quot;수정 실패&quot;);
                 ex.printStackTrace();
              } finally {
                  try{//자원반납(순서 중요)
                      if(rs != null)  rs.close();
                      if(conn != null)  conn.close();
                      if(pstmt != null)  pstmt.close();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
              }
            return re;    
        }

}</code></pre>
<h2 id="3-boardjs">3. board.js</h2>
<pre><code class="language-jsx">function check_ok(){

    if(reg_frm.b_name.value.length == 0){
        alert(&quot;이름을 써주세요.&quot;);
        reg_frm.b_name.focus();
        return;//아이디가 없으면 리턴
    }

    if(reg_frm.b_title.value.length == 0){
        alert(&quot;제목을 써주세요.&quot;);
        reg_frm.b_title.focus();
        return;// 글제목 없으면 리턴
    }
    if(reg_frm.b_content.value.length == 0){
        alert(&quot;내용을 써주세요.&quot;);
        reg_frm.b_content.focus();
        return;//글 내용이 없으면 리턴 
    }


    if(reg_frm.b_pwd.value.length == 0){
        alert(&quot;비밀번호를 써주세요.&quot;);
        reg_frm.b_pwd.focus();
        return;//비밀번호가 없으면 리턴 
    }


    document.reg_frm.submit(); //입력값이 조건에 다 맞으면 action=&quot;write_ok.jsp&quot;으로 가겠다.(전송/submit)
}

function delete_ok(){

    if(del_frm.b_pwd.value.length == 0){
        alert(&quot;비밀번호를 써주세요.&quot;);
        del_frm.b_pwd.focus();
        return;//비밀번호가 없으면 리턴 
    }


    document.del_frm.submit();

}</code></pre>
<h2 id="4writejsp">4.write.jsp</h2>
<pre><code class="language-java">&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음


    int b_id=0, b_ref=1, b_step=0, b_level=0;//(초기값인 경우 
    String b_title=&quot;&quot;;

    if(request.getParameter(&quot;b_id&quot;) != null){
        b_id = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    }    

    BoardDBBean db = BoardDBBean.getInstance();
    BoardBean board = db.getBoard(b_id, false);//조회수 증가 x

    if(board != null){//board가 널값이 아니면(답변글이면)
        b_title = board.getB_title();
        b_ref = board.getB_ref();
        b_step = board.getB_step();
        b_level = board.getB_level();
    }
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
    &lt;script language=&quot;JavaScript&quot; src=&quot;board.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 올 리 기&lt;/h1&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_id&quot; value=&quot;&lt;%= b_id %&gt;&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_ref&quot; value=&quot;&lt;%= b_ref %&gt;&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_step&quot; value=&quot;&lt;%= b_step %&gt;&quot;&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;b_level&quot; value=&quot;&lt;%= b_level %&gt;&quot;&gt;
            &lt;table&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot;&gt;
                    &lt;/td&gt;
                    &lt;td width=&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot; size=&quot;24&quot; maxlength=&quot;50&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;글제목&lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;%
                            if(b_id == 0){//새로운 글이면 
                        %&gt;
                                &lt;input type=&quot;text&quot; name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;&gt;
                        &lt;%
                            }else{
                        %&gt;
                                &lt;input type=&quot;text&quot; name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;
                                     value=&quot;[답변]:&lt;%= b_title %&gt;&quot;&gt;
                        &lt;%
                            }
                        %&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;&gt;
                        &lt;textarea name=&quot;b_content&quot; rows=&quot;10&quot; cols=&quot;65&quot;&gt;&lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;암&amp;nbsp;&amp;nbsp;호&lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;password&quot; name=&quot;b_pwd&quot; size=&quot;12&quot; maxlength=&quot;12&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;50&quot; align=&quot;center&quot;&gt;
                    &lt;td colspan=&quot;4&quot;&gt;
                        &lt;input type=&quot;button&quot; value=&quot;글쓰기&quot; onclick=&quot;check_ok()&quot;&gt;&amp;nbsp;
                        &lt;input type=&quot;reset&quot; value=&quot;다시작성&quot;&gt;
                        &lt;input type=&quot;button&quot; value=&quot;글목록&quot; onclick=&quot;location.href=&#39;list.jsp?pageNum=&lt;%=pageNum%&gt;&#39;&quot;&gt;&amp;nbsp;
                        &lt;!-- 페이지 목록에 맞춰서 이동할 수 있도록 함  --&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="5-write_okjsp">5. write_ok.jsp</h2>
<pre><code class="language-java">&lt;%@page import=&quot;java.net.InetAddress&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;% 
    request.setCharacterEncoding(&quot;UTF-8&quot;);  
%&gt;  
&lt;jsp:useBean class=&quot;magic.board.BoardBean&quot; id=&quot;board&quot;&gt;&lt;/jsp:useBean&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;
&lt;%
    InetAddress address = InetAddress.getLocalHost();
    String ip = address.getHostAddress();

    board.setB_date(new Timestamp(System.currentTimeMillis()));
    //board.setB_ip(request.getRemoteAddr());
    board.setB_ip(ip);
    BoardDBBean db = BoardDBBean.getInstance();
    int re = db.insertBoard(board);

    if(re == 1){
        response.sendRedirect(&quot;list.jsp&quot;);
    }else{
        response.sendRedirect(&quot;write.jsp&quot;);
    }
%&gt;</code></pre>
<h2 id="6showjsp">6.show.jsp</h2>
<pre><code class="language-java">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%    
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음    

    int bid = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    //list.jsp에서 &lt;a href=&quot;show.jsp?b_id=..&gt; 에서 b_id가 넘어옴
    //그후 캐스팅!!

    BoardDBBean db = BoardDBBean.getInstance();
    //getBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
            //getBoard db객체로 받음.(getInstace하면 instance가 리턴됨)

    BoardBean board = db.getBoard(bid, true);
    //BoardBean board = db.getBoard(bid);
    //getBoard 메소드 호출하여 BoardBean 받음(리턴타입은 board)    

    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm&quot;);
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 내 용 보 기&lt;/h1&gt;
        &lt;table border=&quot;1&quot; width=&quot;600&quot; cellspacing=&quot;0&quot;&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글번호&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= bid %&gt;
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;조회수&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= board.getB_hit() %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;작성자&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%= board.getB_name() %&gt;
                    &lt;!--      board 객체를 이용하여 getB_.. 사용! --&gt;
                &lt;/td&gt;
                &lt;td width=&quot;100&quot;&gt;작성일&lt;/td&gt;
                &lt;td width=&quot;200&quot;&gt;
                    &lt;%-- &lt;%= board.getB_date() %&gt; --%&gt;
                    &lt;%= sdf.format(board.getB_date()) %&gt;
                                &lt;!--  board 객체를 이용하여 getB_.. 사용! --&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글제목&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;left&quot;&gt;
                    &lt;%= board.getB_title() %&gt;&lt;!--  board 객체를 이용하여 getB_.. 사용! --&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                &lt;td width=&quot;100&quot;&gt;글내용&lt;/td&gt;
                &lt;td width=&quot;200&quot; align=&quot;left&quot;&gt;
                    &lt;%= board.getB_content() %&gt;&lt;!--  board 객체를 이용하여 getB_.. 사용! --&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr height=&quot;30&quot;&gt;
                &lt;td colspan=&quot;4&quot; align=&quot;right&quot;&gt;
                &lt;!--  페이지 목록에 맞춰야 해서 모두 쿼리스트링을 사용하여 pageNum=&lt;%=pageNum%&gt; 넣어야함 --&gt;
                    &lt;input type=&quot;button&quot; value=&quot;글수정&quot; onclick=&quot;location.href=&#39;edit.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;!-- 해당 게시글의 글번호에 맞는 글 수정로 이동 --&gt;
                    &lt;input type=&quot;button&quot; value=&quot;글삭제&quot; onclick=&quot;location.href=&#39;delete.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;!-- 해당 게시글의 글번호에 맞는 글 삭제로 이동 --&gt;
                    &lt;input type=&quot;button&quot; value=&quot;답변글&quot; onclick=&quot;location.href=&#39;write.jsp?b_id=&lt;%= bid %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
                    &lt;!-- 해당 게시글의 글 번호에 맞는 답변글로 이동  --&gt;
                    &lt;input type=&quot;button&quot; value=&quot;글목록&quot; onclick=&quot;location.href=&#39;list.jsp?pageNum=&lt;%=pageNum%&gt;&#39;&quot;&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="7listjsp">7.list.jsp</h2>
<pre><code class="language-java">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;java.util.ArrayList&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음

    if(pageNum == null){//list를 처음 실행하였을때 아무것도 없을때 보여줄 페이지
        pageNum =&quot;1&quot;;
    }

    BoardDBBean db = BoardDBBean.getInstance();
        //listBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //instance를 db객체로 받음.(getInstace하면 instance가 리턴됨)
    ArrayList&lt;BoardBean&gt; boardList = db.listBoard(pageNum);
    //listBoard메소드 호출하여 ArrayList로 받음(리턴타입은 ArrayList&lt;BoardBean&gt;)

    int b_id, b_hit, b_level=0;
    String b_name, b_email, b_title, b_content;
    Timestamp b_date;

    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm&quot;);
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;게시판에 등록된 글 목록 보기&lt;/h1&gt;
        &lt;table width=&quot;600&quot;&gt;
            &lt;tr&gt;
                &lt;td align=&quot;right&quot;&gt;
                    &lt;a href=&quot;write.jsp?pageNum=&lt;%=pageNum%&gt;&quot;&gt;글 쓰 기&lt;/a&gt;
                    &lt;!-- 페이지 목록 번호에 맞게 글 쓰기 이동  --&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/center&gt;
    &lt;center&gt;
        &lt;table border=&quot;1&quot; width=&quot;800&quot; cellspacing=&quot;0&quot;&gt;
        &lt;!-- &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt; --&gt;
            &lt;tr height=&quot;25&quot;&gt;
                &lt;td width=&quot;40&quot; align=&quot;center&quot;&gt;번호&lt;/td&gt;
                &lt;td width=&quot;450&quot; align=&quot;center&quot;&gt;글제목&lt;/td&gt;
                &lt;td width=&quot;120&quot; align=&quot;center&quot;&gt;작성자&lt;/td&gt;
                &lt;td width=&quot;130&quot; align=&quot;center&quot;&gt;작성일&lt;/td&gt;
                &lt;td width=&quot;60&quot; align=&quot;center&quot;&gt;조회수&lt;/td&gt;
            &lt;/tr&gt;
            &lt;%
                for(int i=0; i&lt;boardList.size(); i++){//게시글 갯수만큼 반복
                    BoardBean board = boardList.get(i);
                    //ArrayList에 담았던 객체들의 값을 가지고 옴
                    //가지고 올때는 반대방향으로 (listBoard 메소드에서 보낸 값을 반대로 풀면 됨)
                    //포장했던걸 푸는 느낌

                    //board객체를 하나씩 풀기    
                    b_id = board.getB_id();
                    b_name = board.getB_name();
                    b_email = board.getB_email();
                    b_title = board.getB_title();
                    b_content = board.getB_content();
                    b_date = board.getB_date();
                    b_hit = board.getB_hit();
                    b_level = board.getB_level();
            %&gt;
            &lt;tr height=&quot;25&quot; bgcolor=&quot;#f7f7f7&quot;
                onmouseover=&quot;this.style.backgroundColor=&#39;#eeeeef&#39;&quot;
                onmouseout=&quot;this.style.backgroundColor=&#39;#f7f7f7&#39;&quot;&gt;
                &lt;td align=&quot;center&quot;&gt;&lt;%= b_id %&gt;&lt;/td&gt;
                &lt;td&gt;
                    &lt;%
                        if(b_level &gt; 0){//답글인경우 공백 및 이미지 삽입
                            for(int j=0; j&lt;b_level; j++){//여백주는걸 반복한다.(댓글의 갯수에 맞게.(대댓글이면 2번 여백을 줌)
                    %&gt;
                                &amp;nbsp;
                    &lt;%
                            }
                    %&gt;
                            &lt;img src=&quot;../images/AnswerLine.gif&quot; width=&quot;16&quot; height=&quot;16&quot;&gt;
                    &lt;%
                        }
                    %&gt;
                    &lt;a href=&quot;show.jsp?b_id=&lt;%= b_id %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&quot;&gt;
                    &lt;!-- 쿼리 스트링 사용해서 표현식으로 몇번째에 갈건지 설정 + &amp; 사용하여 페이지 수 작성--&gt;
                        &lt;%= b_title %&gt;&lt;!-- 새로운 글이나 댓글의 제목  --&gt;
                    &lt;/a&gt;
                &lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;
                    &lt;a href=&quot;mailto:&lt;%= b_email %&gt;&quot;&gt;
                        &lt;%= b_name %&gt;
                    &lt;/a&gt;
                &lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;
                    &lt;%-- &lt;%= b_date %&gt; --%&gt;
                    &lt;%= sdf.format(b_date) %&gt;
                &lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;
                    &lt;%= b_hit %&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            &lt;%
                }
            %&gt;
            &lt;!-- &lt;/form&gt; --&gt;
        &lt;/table&gt;

        &lt;%= BoardBean.pageNumber(4) %&gt;
        &lt;!--  return 받아서 4페이지씩 나눠서 출력  --&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="8editjsp">8.edit.jsp</h2>
<pre><code class="language-java">&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%
    String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음

    int b_id = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    //b_id값을 받아옴.
    BoardDBBean db = BoardDBBean.getInstance();
    //instance를 db객체로 받음.(객체 생성)
    BoardBean board = db.getBoard(b_id, false);
    //수정할때는 조회수가 올라가지 않도록 false 처리함.
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
    &lt;script language=&quot;JavaScript&quot; src=&quot;board.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 올 리 기&lt;/h1&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;edit_ok.jsp?b_id=&lt;%= b_id %&gt;&amp;pageNum=&lt;%= pageNum %&gt;&quot;&gt;
            &lt;!-- 쿼리스트링 꼬오옥 생각하기 --&gt;
            &lt;table&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot; value=&quot;&lt;%= board.getB_name() %&gt;&quot;&gt;
                    &lt;/td&gt;
                    &lt;td width=&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot; size=&quot;24&quot; maxlength=&quot;50&quot; value=&quot;&lt;%= board.getB_email() %&gt;&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;글제목&lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot; value=&quot;&lt;%= board.getB_title() %&gt;&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;&gt;
                        &lt;textarea name=&quot;b_content&quot; rows=&quot;10&quot; cols=&quot;65&quot;&gt;
                             &lt;%= board.getB_content() %&gt;
                        &lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;암&amp;nbsp;&amp;nbsp;호&lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;password&quot; name=&quot;b_pwd&quot; size=&quot;12&quot; maxlength=&quot;12&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height=&quot;50&quot; align=&quot;center&quot;&gt;
                    &lt;td colspan=&quot;4&quot;&gt;
                        &lt;input type=&quot;button&quot; value=&quot;글수정&quot; onclick=&quot;check_ok()&quot;&gt;&amp;nbsp;
                        &lt;input type=&quot;reset&quot; value=&quot;다시작성&quot;&gt;
                        &lt;input type=&quot;button&quot; value=&quot;글목록&quot; onclick=&quot;location.href=&#39;list.jsp?pageNum=&lt;%=pageNum%&gt;&#39;&quot;&gt;&amp;nbsp;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="9edit_okjsp">9.edit_ok.jsp</h2>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot; %&gt;
&lt;% 
    request.setCharacterEncoding(&quot;UTF-8&quot;);  
%&gt; 
&lt;!-- 자바 빈 위에 UTF-8을 넣어야함 안그러면 글자가 깨짐  --&gt; 
&lt;jsp:useBean id=&quot;board&quot; class=&quot;magic.board.BoardBean&quot;&gt;&lt;/jsp:useBean&gt;
&lt;!-- 한번에 모든 값들을 가지고옴  --&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;
&lt;!-- 한번에 모든 값들을 받아와서 세팅  --&gt;
&lt;!DOCTYPE html&gt;

&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%
        String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음

        BoardDBBean db = BoardDBBean.getInstance();
        //getInstance로 BoardDBBean 객체 생성
        int re = db.editBoard(board);

//       String b_pwd = request.getParameter(&quot;b_pwd&quot;);
        // 비밀번호 editBoard 메소드에서 안받음 board 객체로 받기 때문에 이런식으로 값을 받는거 아님!!! 



//        int re =  db.deleteBoard(b_id, b_pwd);
        //deleteBoard 메소드 호출하여 글번호와 비밀번호 넘김



         if(re == 1){//수정성공햇을 때
//                response.sendRedirect(&quot;list.jsp&quot;);
                response.sendRedirect(&quot;list.jsp?pageNum=&quot;+pageNum);
                //쿼리 스트링이 아닌 방식으로 글 목록번호에 맞게 링크 이동함.
            }else if(re == 0){//비밀번호가 틀릴 때
        %&gt;
            &lt;script language =&quot;JavaScript&quot;&gt;
                alert(&quot;비밀번호가 맞지 않습니다.&quot;);
                history.go(-1);
            &lt;/script&gt;
        &lt;%
            }else if(re == -1){//수정 실패했을 때
        %&gt;
            &lt;script language =&quot;JavaScript&quot;&gt;
                alert(&quot;수정에 실패하였습니다.&quot;);
                history.go(-1);
            &lt;/script&gt;

        &lt;%
            }

        %&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="10deletejsp">10.delete.jsp</h2>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot; %&gt;
&lt;% 
    request.setCharacterEncoding(&quot;UTF-8&quot;);  
%&gt; 
&lt;!-- 자바 빈 위에 UTF-8을 넣어야함 안그러면 글자가 깨짐  --&gt; 
&lt;jsp:useBean id=&quot;board&quot; class=&quot;magic.board.BoardBean&quot;&gt;&lt;/jsp:useBean&gt;
&lt;!-- 한번에 모든 값들을 가지고옴  --&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;
&lt;!-- 한번에 모든 값들을 받아와서 세팅  --&gt;
&lt;!DOCTYPE html&gt;

&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%
        String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음

        BoardDBBean db = BoardDBBean.getInstance();
        //getInstance로 BoardDBBean 객체 생성
        int re = db.editBoard(board);

//       String b_pwd = request.getParameter(&quot;b_pwd&quot;);
        // 비밀번호 editBoard 메소드에서 안받음 board 객체로 받기 때문에 이런식으로 값을 받는거 아님!!! 



//        int re =  db.deleteBoard(b_id, b_pwd);
        //deleteBoard 메소드 호출하여 글번호와 비밀번호 넘김



         if(re == 1){//수정성공햇을 때
//                response.sendRedirect(&quot;list.jsp&quot;);
                response.sendRedirect(&quot;list.jsp?pageNum=&quot;+pageNum);
                //쿼리 스트링이 아닌 방식으로 글 목록번호에 맞게 링크 이동함.
            }else if(re == 0){//비밀번호가 틀릴 때
        %&gt;
            &lt;script language =&quot;JavaScript&quot;&gt;
                alert(&quot;비밀번호가 맞지 않습니다.&quot;);
                history.go(-1);
            &lt;/script&gt;
        &lt;%
            }else if(re == -1){//수정 실패했을 때
        %&gt;
            &lt;script language =&quot;JavaScript&quot;&gt;
                alert(&quot;수정에 실패하였습니다.&quot;);
                history.go(-1);
            &lt;/script&gt;

        &lt;%
            }

        %&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="11delete_okjsp">11.delete_ok.jsp</h2>
<pre><code class="language-java">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot; %&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;

    &lt;%
        String pageNum = request.getParameter(&quot;pageNum&quot;);//pageNum을 받음

        int b_id = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
        //입력 받은 id 값을  onclick으로 넘겨줌

        String b_pwd = request.getParameter(&quot;b_pwd&quot;);
        // 비밀번호도 다시 받음


        BoardDBBean db = BoardDBBean.getInstance();
        //getInstance로 BoardDBBean 객체 생성
        int re =  db.deleteBoard(b_id, b_pwd);
        //deleteBoard 메소드 호출하여 글번호와 비밀번호 넘김

        if(re == 1){//비밀번호가 동일 할 경우
            response.sendRedirect(&quot;list.jsp?pageNum=&quot;+pageNum);
        }else if(re == 0){//비밀번호가 다른 경우
    %&gt;
            &lt;script language=&quot;JavaScript&quot;&gt;
                alert(&quot;비밀번호가 맞지 않습니다.&quot;);
                history.go(-1);//이전페이지로 이동
            &lt;/script&gt;
    &lt;%    
        }else if(re == -1){//글번호가 없는 경우(삭제 실패한 경우)
    %&gt;
            &lt;script language=&quot;JavaScript&quot;&gt;
                alert(&quot;삭제에 실패하였습니다.&quot;);
                history.go(-1);
            &lt;/script&gt;
    &lt;%    
        }
    %&gt;</code></pre>
<hr>
<h1 id="자료실-ppt01">자료실 PPT.01</h1>
<h2 id="파일-업로드의-기본적인-폼-형식">파일 업로드의 기본적인 폼 형식</h2>
<p><code>&lt;form name=&quot;폼이름&quot; action=&quot;데이터전송페이지” 
  method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;</code>
<img src="https://velog.velcdn.com/images/sofia_777/post/8dc5a6cf-3b6d-435c-8e58-b49f2e8a995d/image.png" alt=""></p>
<h2 id="파일-내용-보기">파일 내용 보기</h2>
<pre><code class="language-java">InputStream is = request.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
br.readLine() //한줄 씩 읽음</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/a94acd49-7741-420d-b863-eae831d026a1/image.png" alt=""></p>
<h3 id="예제1-파일-업로드-및-정보-읽기">예제1. 파일 업로드 및 정보 읽기</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/244ae2dd-e0fe-4931-b893-813dcf5d4fc7/image.png" alt=""></p>
<p>먼저 위의 사진처럼 fileUpload폴더안의 파일들을 생성</p>
<h4 id="uploadhtml">upload.html</h4>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form method=&quot;post&quot; action=&quot;upload.jsp&quot; enctype=&quot;multipart/form-data&quot;&gt;
    자료 올리기 &lt;br&gt;
    파일 선택하기  : &amp;nbsp;
    &lt;input type=&quot;file&quot; name=&quot;filesel&quot; size=&quot;50&quot;&gt;
    &lt;hr&gt;&lt;br&gt;
    &lt;input type=&quot;submit&quot; value=&quot;자료 올리기&quot;&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="uploadjsp">upload.jsp</h4>
<pre><code class="language-java">&lt;%@page import=&quot;java.io.InputStreamReader&quot;%&gt;
&lt;%@page import=&quot;java.io.BufferedReader&quot;%&gt;
&lt;%@page import=&quot;java.io.InputStream&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;% 
    InputStream is = request.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));    
    String str = null;

    while((str = br.readLine()) != null){
%&gt;
        &lt;%= str %&gt;
&lt;%
    }
%&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/cdd9933b-82c5-4979-aaba-00af6b960647/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/ca8162a9-1298-44d8-b90e-0826b4ac0a70/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/8a1b40c6-ebd2-496d-94ba-85cc54754743/image.png" alt="">
사진과 같이 작동함</p>
<h1 id="자료실-ppt02">자료실 PPT.02</h1>
<h2 id="파일-업로드에-관한-패키지-종류">파일 업로드에 관한 패키지 종류</h2>
<ol>
<li>jspSmartUpload (가장 유명한패키지)//그러나 종료됨
UPLOAD 패키지(jar)에 포함
파일의 업로드가 무지 쉽게 구현</li>
<li>MultipartRequest//많이 사용하는 방법
COS 패키지(jar)에 포함
jspSmartUpload는 로직자체에 문제점 으로 대체</li>
<li>아파치 API 이용
commons-fileupload.jar / commons.io.jar
편리하고 강력한 API 제공</li>
</ol>
<p>*. 오픈 라이브러리 다운로드 사이트
cos.jar : <a href="http://servlets.com/cos">http://servlets.com/cos</a> 
Commons~.jar : <a href="http://commons.apache.org/downloads/">http://commons.apache.org/downloads/</a></p>
<h2 id="디렉토리-오류-발생">디렉토리 오류 발생</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/28b0b1f2-4e64-471d-8088-317873d41785/image.png" alt=""></p>
<p>그래서 파일 업로드 설정이 필요함.</p>
<ol>
<li>D:\space_jsp.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\magicWebApp\fileUpload
(각각 해당되는 경로로 찾아가기)
<img src="https://velog.velcdn.com/images/sofia_777/post/bae201a4-5fb3-4bc7-b392-df353fcb74ab/image.png" alt="">
그후 아래와 같이 upload 파일 생성(여기에 파일들이 업로드 될 거임)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/f30dea9d-b221-4add-a66e-ba9a9a04d38c/image.png" alt=""></p>
<p>그후 사진과 같이 upload.jar 추가</p>
<h3 id="예제2">예제2</h3>
<h4 id="uploadfilehtml">uploadFile.html</h4>
<pre><code class="language-java">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form action=&quot;uploadFile.jsp&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
        1. 파일 지정하기 : &lt;input type=&quot;file&quot; name=&quot;filesel01&quot; size=&quot;50&quot;&gt;
        2. 파일 지정하기 : &lt;input type=&quot;file&quot; name=&quot;filesel02&quot; size=&quot;50&quot;&gt;
        3. 파일 지정하기 : &lt;input type=&quot;file&quot; name=&quot;filesel03&quot; size=&quot;50&quot;&gt;
        4. 파일 지정하기 : &lt;input type=&quot;file&quot; name=&quot;filesel04&quot; size=&quot;50&quot;&gt;
        5. 파일 지정하기 : &lt;input type=&quot;file&quot; name=&quot;filesel05&quot; size=&quot;50&quot;&gt;
        &lt;hr&gt;&lt;br&gt;
        &lt;input type=&quot;submit&quot; value=&quot;자료 올리기&quot;&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="uploadfilejsp">uploadFile.jsp</h4>
<pre><code class="language-java">&lt;%@page import=&quot;com.jspsmart.upload.File&quot;%&gt;
&lt;%@page import=&quot;com.jspsmart.upload.SmartUpload&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    SmartUpload upload = new SmartUpload();//객체생성
    upload.initialize(pageContext);//기본 객체 초기화
    upload.upload();//upload 메소드 호출
    int last = upload.getFiles().getCount();//파일 갯수
    int cnt = 0;

    for(int i=0; i&lt;last; i++){//파일 업로드 갯수만큼 반복
        File file = upload.getFiles().getFile(i);    

        if(!file.isMissing()){
            file.saveAs(&quot;/upload/&quot;+file.getFieldName());//파일 이름을 저장하겠다.

            out.print(&quot;폼 태그 필드 이름 : &quot;+file.getFieldName()+&quot;&lt;br&gt;&quot;);
            out.print(&quot;파일 이름 : &quot;+file.getFileName()+&quot;&lt;br&gt;&quot;);
            out.print(&quot;파일 크기 : &quot;+file.getSize()+&quot;&lt;br&gt;&quot;);
            out.print(&quot;파일 확장자 : &quot;+file.getFileExt()+&quot;&lt;br&gt;&quot;);
            out.print(&quot;파일 경로 : &quot;+file.getFilePathName()+&quot;&lt;br&gt;&quot;);
            out.print(&quot;&lt;br&gt;================================&lt;br&gt;&quot;);

            cnt++;
        }
    }

    out.print(&quot;&quot;+cnt+&quot;개를 업로드 했습니다.&quot;);
%&gt;</code></pre>
<p>그후 코드 실행하기
<img src="https://velog.velcdn.com/images/sofia_777/post/d25a16b4-070a-44ed-84dd-0441bfcec5cb/image.png" alt="">
확인해보면 upload 파일에 파일들이 올라감
<img src="https://velog.velcdn.com/images/sofia_777/post/b10914a3-d49a-469f-ad7b-cbb97b7a56d7/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.09.02 JSP]]></title>
            <link>https://velog.io/@sofia_777/2022.09.02-JSP</link>
            <guid>https://velog.io/@sofia_777/2022.09.02-JSP</guid>
            <pubDate>Sun, 04 Sep 2022 16:28:14 GMT</pubDate>
            <description><![CDATA[<h1 id="게시판">게시판</h1>
<h3 id="writejsp">write.jsp</h3>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;script language=&quot;JavaScript&quot; src=&quot;board.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글올리기&lt;/h1&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt;
            &lt;table align =&quot;center&quot;&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자 &lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot;&gt;
                    &lt;/td&gt;
                    &lt;td  =&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot;size=&quot;24&quot; maxlength=&quot;50&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width =&quot;80&quot;&gt;글제목 &lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;text&quot;name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;  align =&quot;center&quot;&gt;
                    &lt;textarea cols=&quot;65&quot; rows=&quot;10&quot; name=&quot;b_content&quot;&gt;&lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;50&quot; align =&quot;center&quot;&gt;
                    &lt;td colspan = &quot;4&quot; &gt;
                        &lt;input type=&quot;button&quot; value=&quot;글쓰기&quot;  onclick=&quot;check_ok()&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;button&quot; value=&quot;글목록&quot;  onclick=&quot;location.href=&#39;list.jsp&#39;&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="write_okjsp">write_ok.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;jsp:useBean id=&quot;board&quot; class=&quot;magic.board.BoardBean&quot;/&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;    

&lt;%
        BoardDBBean db = BoardDBBean.getInstance();
                //instance를 db객체로 받음.
       int re =  db.insertBoard(board);//분기처리 
       System.out.println(&quot;@@@###getMem_uid ===&gt;&quot;+ re); //getMem_uid를 잘 받는지 확인

           if(re == 1) {//분기처리 
    %&gt;
        &lt;script&gt;
            alert(&quot;글을 등록 하셨습니다.&quot;);
        &lt;/script&gt;
&lt;%
            response.sendRedirect(&quot;list.jsp&quot;); //이동
        }else {
%&gt;
        &lt;script&gt;
            alert(&quot;글 등록에 실패했습니다.&quot;);
        &lt;/script&gt;
&lt;%
            response.sendRedirect(&quot;write.jsp&quot;); //이동
        }

%&gt;</code></pre>
<h3 id="boarddbbeanjava">BoardDBBean.java</h3>
<pre><code class="language-sql">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
    public int insertBoard(BoardBean board) throws Exception{
        int re = -1;
        int number;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        String sql =&quot;&quot;;

        try {
            conn = getConnection();
            sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;//글번호 추가
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(rs.next()) {//다음 쿼리 데이터가 있는 경우를 조건문으로 줌.
                number = rs.getInt(1)+1;
                //글번호가 가장 큰 값을 조회하여 1증가 한 값을 INSERT쿼리에 추가
            } else {
                number = 1;
            }

            sql = &quot;INSERT INTO BOARDT VALUES (?,?,?,?,?)&quot;;
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언

//            데이터가 제대로 들어갔는지 확인 해야함
            System.out.println(&quot;@@@@#### number=====&gt;&quot;+number);
            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
            System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
            System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
            System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());

            pstmt.setInt(1, number);//인덱스 번호 변경 및 글번호 (number) 추가
            pstmt.setString(2, board.getB_name());
            pstmt.setString(3, board.getB_email());
            pstmt.setString(4, board.getB_title());
            pstmt.setString(5, board.getB_content());

            pstmt.executeUpdate();
            re =1;



        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }

        return re;    
    }


    //4. 리턴타입이 ArrayList&lt;BoardBean&gt; 인 listBoard() 메소드 추가(글목록을 위한 메소드)
    public ArrayList&lt;BoardBean&gt; listBoard() throws Exception{//제네릭 사용함 , 파라미터는 BoardBean

        Connection conn = null;//데이터 베이스 접속
        Statement stmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        //db 정보 받기 위함
        String sql = &quot;SELECT b_id\r\n&quot; + 
                &quot;     , b_name\r\n&quot; + 
                &quot;     , b_email\r\n&quot; + 
                &quot;     , b_title\r\n&quot; + 
                &quot;     , b_content \r\n&quot; + 
                &quot;  FROM BOARDT \r\n&quot; + 
                &quot; ORDER BY B_ID&quot;;//해당 데이터 쿼리 정렬되게끔 함.
        ArrayList&lt;BoardBean&gt; boardList = new ArrayList&lt;BoardBean&gt;();//ArrayList로 게시글들을 받음

        try {
            conn = getConnection();
            //pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            stmt = conn.createStatement();// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = stmt.executeQuery(sql);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리


            while(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                BoardBean board = new BoardBean();
                board.setB_id(rs.getInt(1));//아이디는 INT이므로 getInt로 해야함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));

//                데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
//                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());

                boardList.add(board);//반복하면서 게시글들을 쌓음

            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(stmt != null)  stmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return boardList;
    }
}</code></pre>
<h3 id="listjsp">list.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;java.util.ArrayList&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    BoardDBBean db = BoardDBBean.getInstance();
        //listBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //instance를 db객체로 받음.(getInstace하면 instance가 리턴됨)
    ArrayList&lt;BoardBean&gt; boardList = db.listBoard();
        //listBoard메소드 호출하여 ArrayList로 받음(리턴타입은 ArrayList&lt;BoardBean&gt;)
    String b_name, b_title, b_email, b_content = &quot;&quot;;
    int b_id;
%&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;게시판에 등록된 글 목록 보기&lt;/h1&gt;
        &lt;table width=&quot;600&quot;&gt;
                &lt;tr&gt;
                    &lt;td align=&quot;right&quot;&gt;
                        &lt;a href=&quot;write.jsp&quot;&gt;글 쓰 기&lt;/a&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;

        &lt;table width=&quot;800&quot; border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
            &lt;!-- &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt; --&gt;
                &lt;tr height=&quot;25&quot;&gt;
                    &lt;td width=&quot;40&quot; align=&quot;center&quot;&gt;번호&lt;/td&gt;
                    &lt;td width=&quot;450&quot; align=&quot;center&quot;&gt;글제목&lt;/td&gt;
                    &lt;td width=&quot;120&quot; align=&quot;center&quot;&gt;작성자&lt;/td&gt;
                &lt;/tr&gt;

        &lt;%    
            for(int i=0; i&lt;boardList.size(); i++){//게시글 갯수만큼 반복
                BoardBean board = boardList.get(i);
                    //ArrayList에 담았던 객체들의 값을 가지고 옴
                    //가지고 올때는 반대방향으로 (listBoard 메소드에서 보낸 값을 반대로 풀면 됨)
                    //포장했던걸 푸는 느낌

                //board객체를 하나씩 풀기    
                b_id = board.getB_id();
                b_name = board.getB_name();
                b_email = board.getB_email();
                b_title = board.getB_title();
                b_content = board.getB_content();
        %&gt;
                &lt;tr height=&quot;25&quot;
                onmouseout=&quot;this.style.backgroundColor = &#39;#f7f7f7&#39;&quot;
                 onmouseover=&quot;this.style.backgroundColor = &#39;#eeeeef&#39;&quot;&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;%= b_id %&gt;
                    &lt;/td&gt;
                    &lt;td&gt;
                        &lt;%= b_title %&gt;
                    &lt;/td&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;a href=&quot;mailto:&lt;%= b_email %&gt;&quot;&gt;&lt;%= b_name %&gt;&lt;/a&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
&lt;%
            }
%&gt;                
            &lt;!-- &lt;/form&gt; --&gt;
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/1c0822c6-3ea4-41c5-9707-40f75f05d3e7/image.png" alt=""></p>
<hr>
<h2 id="1-4ppt">1-4PPT</h2>
<h3 id="listjsp-1">list.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;java.util.ArrayList&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    BoardDBBean db = BoardDBBean.getInstance();
        //listBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //instance를 db객체로 받음.(getInstace하면 instance가 리턴됨)
    ArrayList&lt;BoardBean&gt; boardList = db.listBoard();
        //listBoard메소드 호출하여 ArrayList로 받음(리턴타입은 ArrayList&lt;BoardBean&gt;)
    String b_name, b_title, b_email, b_content = &quot;&quot;;
    int b_id;
%&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;게시판에 등록된 글 목록 보기&lt;/h1&gt;
        &lt;table width=&quot;600&quot;&gt;
                &lt;tr&gt;
                    &lt;td align=&quot;right&quot;&gt;
                        &lt;a href=&quot;write.jsp&quot;&gt;글 쓰 기&lt;/a&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;

        &lt;table width=&quot;800&quot; border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
            &lt;!-- &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt; --&gt;
                &lt;tr height=&quot;25&quot;&gt;
                    &lt;td width=&quot;40&quot; align=&quot;center&quot;&gt;번호&lt;/td&gt;
                    &lt;td width=&quot;450&quot; align=&quot;center&quot;&gt;글제목&lt;/td&gt;
                    &lt;td width=&quot;120&quot; align=&quot;center&quot;&gt;작성자&lt;/td&gt;
                &lt;/tr&gt;

        &lt;%    
            for(int i=0; i&lt;boardList.size(); i++){//게시글 갯수만큼 반복
                BoardBean board = boardList.get(i);
                    //ArrayList에 담았던 객체들의 값을 가지고 옴
                    //가지고 올때는 반대방향으로 (listBoard 메소드에서 보낸 값을 반대로 풀면 됨)
                    //포장했던걸 푸는 느낌

                //board객체를 하나씩 풀기    
                b_id = board.getB_id();
                b_name = board.getB_name();
                b_email = board.getB_email();
                b_title = board.getB_title();
                b_content = board.getB_content();
        %&gt;
                &lt;tr height=&quot;25&quot;
                onmouseout=&quot;this.style.backgroundColor = &#39;#f7f7f7&#39;&quot;
                 onmouseover=&quot;this.style.backgroundColor = &#39;#eeeeef&#39;&quot;&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;%= b_id %&gt;
                    &lt;/td&gt;
                    &lt;td&gt;
                        &lt;a href=&quot;show.jsp?b_id=&lt;%= b_id %&gt;&quot;&gt;
                        &lt;%--쿼리 스트링 사용해서 표현식으로 몇번째에 갈건지 설정 --%&gt;
                            &lt;%= b_title %&gt;
                        &lt;/a&gt;
                    &lt;/td&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;a href=&quot;mailto:&lt;%= b_email %&gt;&quot;&gt;&lt;%= b_name %&gt;&lt;/a&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
&lt;%
            }
%&gt;                
            &lt;!-- &lt;/form&gt; --&gt;
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="boarddbbeanjsp">BoardDBBean.jsp</h3>
<pre><code class="language-sql">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
    public int insertBoard(BoardBean board) throws Exception{
        int re = -1;
        int number;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        String sql =&quot;&quot;;

        try {
            conn = getConnection();
            sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;//글번호 추가
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(rs.next()) {//다음 쿼리 데이터가 있는 경우를 조건문으로 줌.
                number = rs.getInt(1)+1;
                //글번호가 가장 큰 값을 조회하여 1증가 한 값을 INSERT쿼리에 추가
            } else {
                number = 1;
            }

            sql = &quot;INSERT INTO BOARDT VALUES (?,?,?,?,?)&quot;;
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언

//            데이터가 제대로 들어갔는지 확인 해야함
            System.out.println(&quot;@@@@#### number=====&gt;&quot;+number);
            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
            System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
            System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
            System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());

            pstmt.setInt(1, number);//인덱스 번호 변경 및 글번호 (number) 추가
            pstmt.setString(2, board.getB_name());
            pstmt.setString(3, board.getB_email());
            pstmt.setString(4, board.getB_title());
            pstmt.setString(5, board.getB_content());

            pstmt.executeUpdate();
            re =1;

        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }

        return re;    
    }


    //4. 리턴타입이 ArrayList&lt;BoardBean&gt; 인 listBoard() 메소드 추가(글목록을 위한 메소드)
    public ArrayList&lt;BoardBean&gt; listBoard() throws Exception{//제네릭 사용함 , 파라미터는 BoardBean

        Connection conn = null;//데이터 베이스 접속
        Statement stmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        //db 정보 받기 위함
        String sql = &quot;SELECT b_id\r\n&quot; + 
                &quot;     , b_name\r\n&quot; + 
                &quot;     , b_email\r\n&quot; + 
                &quot;     , b_title\r\n&quot; + 
                &quot;     , b_content \r\n&quot; + 
                &quot;  FROM BOARDT \r\n&quot; + 
                &quot; ORDER BY B_ID&quot;;//해당 데이터 쿼리 정렬되게끔 함.
        ArrayList&lt;BoardBean&gt; boardList = new ArrayList&lt;BoardBean&gt;();//ArrayList로 게시글들을 받음

        try {
            conn = getConnection();
            //pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            stmt = conn.createStatement();// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = stmt.executeQuery(sql);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리


            while(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                BoardBean board = new BoardBean();
                //결과값을 세팅
                board.setB_id(rs.getInt(1));//아이디는 INT이므로 getInt로 해야함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));

//                데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
//                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());

                boardList.add(board);//반복하면서 게시글들을 쌓음

            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(stmt != null)  stmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return boardList;
    }


    // 5. 리턴타입이 BoardBean인 getBoard() 메소드 추가
    public BoardBean getBoard (int bid) throws Exception{//글번호만 넘기면 알아서 내용이 넘어가는 메소드 
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        //db 정보 받기 위함
        String sql = &quot;SELECT b_id\r\n&quot; + 
                &quot;    , b_name\r\n&quot; + 
                &quot;    , b_email\r\n&quot; + 
                &quot;    , b_title\r\n&quot; + 
                &quot;    , b_content\r\n&quot; + 
                &quot; FROM BOARDT\r\n&quot; + 
                &quot; WHERE b_id=?&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
        BoardBean board = null;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리


            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                board = new BoardBean();//객체생성(리턴값이 board)
                board.setB_id(rs.getInt(1));
                //board.setB_id(bid);도 가능함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
//                
////                데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### board.setB_id()=====&gt;&quot;+board.getB_id());
//                System.out.println(&quot;@@@@#### board.setB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.setB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.setB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.setB_content()=====&gt;&quot;+board.getB_content());
            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return board;
    }



}</code></pre>
<h3 id="showjsp">show.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;

&lt;%
    int bid = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    //list.jsp에서 &lt;a href=&quot;show.jsp?b_id=..&gt; 에서 b_id가 넘어옴
            //그후 캐스팅!!

    BoardDBBean db = BoardDBBean.getInstance();
        //getBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //getBoard db객체로 받음.(getInstace하면 instance가 리턴됨)
    BoardBean board =db.getBoard(bid);
        //getBoard 메소드 호출하여 BoardBean 받음(리턴타입은 board)

    /* String b_name = &quot;&quot;;
    String b_title  = &quot;&quot;;
    String b_email  = &quot;&quot;;
    String b_content = &quot;&quot;; */
    //오류나서 하나하나 넣어줌


    /* if(board != null){
        int b_id = board.getB_id();
        b_name = board.getB_name();
        b_email = board.getB_email();
        b_title = board.getB_title();
        b_content = board.getB_content();
    } */
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 내 용 보 기&lt;/h1&gt;
        &lt;table width=&quot;600&quot; border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;글번호&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;
                        &lt;%= bid %&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;&lt;%= board.getB_name() %&gt;&lt;/td&gt;
                    &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;
                &lt;/tr&gt;        

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;글제목&lt;/td&gt;
                    &lt;td width=&quot;200&quot; align=&quot;left&quot;&gt;&lt;%= board.getB_title() %&gt;&lt;/td&gt;
                &lt;/tr&gt;    

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;글내용&lt;/td&gt;
                    &lt;td width=&quot;200&quot; align=&quot;left&quot;&gt;&lt;%= board.getB_content() %&gt;&lt;/td&gt;
                &lt;/tr&gt;        
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="table-수정">TABLE 수정</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/0732a6bb-8347-4f2d-b7a3-42a70bd65d65/image.png" alt=""></p>
<hr>
<p>1-5 PPT</p>
<h3 id="showjsp-1">show.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;

&lt;%
    int bid = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    //list.jsp에서 &lt;a href=&quot;show.jsp?b_id=..&gt; 에서 b_id가 넘어옴
            //그후 캐스팅!!

    BoardDBBean db = BoardDBBean.getInstance();
        //getBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //getBoard db객체로 받음.(getInstace하면 instance가 리턴됨)
    BoardBean board =db.getBoard(bid);
        //getBoard 메소드 호출하여 BoardBean 받음(리턴타입은 board)



    Timestamp b_date = null;    


    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd hh:mm&quot;);    
    /* String b_name = &quot;&quot;;
    String b_title  = &quot;&quot;;
    String b_email  = &quot;&quot;;
    String b_content = &quot;&quot;; */
    //오류나서 하나하나 넣어줌


    /* if(board != null){
        int b_id = board.getB_id();
        b_name = board.getB_name();
        b_email = board.getB_email();
        b_title = board.getB_title();
        b_content = board.getB_content();
    } */
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 내 용 보 기&lt;/h1&gt;
        &lt;table width=&quot;600&quot; border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;글번호&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;
                        &lt;%= bid %&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;&lt;%= board.getB_name() %&gt;&lt;/td&gt;
                                    &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;

                    &lt;td width=&quot;100&quot;&gt;작성일&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;&lt;%= sdf.format(board.getB_date())  %&gt;&lt;/td&gt;
                                                 &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;
                &lt;/tr&gt;        

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot; &gt;글제목&lt;/td&gt;
                    &lt;td width=&quot;200&quot; align=&quot;left&quot;  colspan = &quot;3&quot;&gt;
                        &lt;%= board.getB_title() %&gt;
                        &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;    

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;글내용&lt;/td&gt;
                    &lt;td width=&quot;200&quot; align=&quot;left&quot;  colspan = &quot;3&quot;&gt;
                        &lt;%= board.getB_content() %&gt;
                        &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;        

        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="boarddbbeanjs">BoardDBBean.js</h3>
<pre><code class="language-sql">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
    public int insertBoard(BoardBean board) throws Exception{
        int re = -1;
        int number;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        String sql =&quot;&quot;;

        try {
            conn = getConnection();
            sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;//글번호 추가
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(rs.next()) {//다음 쿼리 데이터가 있는 경우를 조건문으로 줌.
                number = rs.getInt(1)+1;
                //글번호가 가장 큰 값을 조회하여 1증가 한 값을 INSERT쿼리에 추가
            } else {
                number = 1;
            }

            sql = &quot;INSERT INTO BOARDT VALUES (?,?,?,?,?,?)&quot;;
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언

//            데이터가 제대로 들어갔는지 확인 해야함
//            System.out.println(&quot;@@@@#### number=====&gt;&quot;+number);
//            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
//            System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
//            System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
//            System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
//            System.out.println(&quot;@@@@#### board.getB_date()=====&gt;&quot;+board.getB_date());

            pstmt.setInt(1, number);//인덱스 번호 변경 및 글번호 (number) 추가
            pstmt.setString(2, board.getB_name());
            pstmt.setString(3, board.getB_email());
            pstmt.setString(4, board.getB_title());
            pstmt.setString(5, board.getB_content());
            pstmt.setTimestamp(6, board.getB_date());//날짜 및 시간 저장한걸 추가(setTimestamp)

            pstmt.executeUpdate();
            re = 1;

        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }

        return re;    
    }


    //4. 리턴타입이 ArrayList&lt;BoardBean&gt; 인 listBoard() 메소드 추가(글목록을 위한 메소드)
    public ArrayList&lt;BoardBean&gt; listBoard() throws Exception{//제네릭 사용함 , 파라미터는 BoardBean

        Connection conn = null;//데이터 베이스 접속
        Statement stmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        //db 정보 받기 위함
        String sql = &quot;SELECT b_id\r\n&quot; + 
                &quot;     , b_name\r\n&quot; + 
                &quot;     , b_email\r\n&quot; + 
                &quot;     , b_title\r\n&quot; + 
                &quot;     , b_content \r\n&quot; + 
                &quot;     , b_date\r\n&quot; + 
                &quot;  FROM BOARDT \r\n&quot; + 
                &quot; ORDER BY B_ID&quot;;//해당 데이터 쿼리 정렬되게끔 함.
        ArrayList&lt;BoardBean&gt; boardList = new ArrayList&lt;BoardBean&gt;();//ArrayList로 게시글들을 받음

        try {
            conn = getConnection();
            //pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            stmt = conn.createStatement();// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = stmt.executeQuery(sql);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리


            while(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                BoardBean board = new BoardBean();
                //결과값을 세팅
                board.setB_id(rs.getInt(1));//아이디는 INT이므로 getInt로 해야함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
                board.setB_date(rs.getTimestamp(6));

//                데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
//                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());

                boardList.add(board);//반복하면서 게시글들을 쌓음

            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(stmt != null)  stmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return boardList;
    }


    // 5. 리턴타입이 BoardBean인 getBoard() 메소드 추가
    public BoardBean getBoard (int bid) throws Exception{//글번호만 넘기면 알아서 내용이 넘어가는 메소드 
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        //db 정보 받기 위함
        String sql = &quot;SELECT b_id\r\n&quot; + 
                &quot;    , b_name\r\n&quot; + 
                &quot;    , b_email\r\n&quot; + 
                &quot;    , b_title\r\n&quot; + 
                &quot;    , b_content\r\n&quot; + 
                &quot;    , b_date\r\n&quot; + 
                &quot; FROM BOARDT\r\n&quot; + 
                &quot; WHERE b_id=?&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
        BoardBean board = null;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리


            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                board = new BoardBean();//객체생성(리턴값이 board)
                board.setB_id(rs.getInt(1));
                //board.setB_id(bid);도 가능함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
                board.setB_date(rs.getTimestamp(6));
//                
////                데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### board.setB_id()=====&gt;&quot;+board.getB_id());
//                System.out.println(&quot;@@@@#### board.setB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.setB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.setB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.setB_content()=====&gt;&quot;+board.getB_content());
            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return board;
    }



}</code></pre>
<h3 id="wirte_okjsp">wirte_ok.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;jsp:useBean id=&quot;board&quot; class=&quot;magic.board.BoardBean&quot;/&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;    

&lt;%
        BoardDBBean db = BoardDBBean.getInstance();
                //instance를 db객체로 받음.

        board.setB_date(new Timestamp(System.currentTimeMillis())); 
                //BoardBean객체에 b_date 프로퍼티 값에 오늘 날짜 저장

        int re =  db.insertBoard(board);//분기처리 
        //System.out.println(&quot;@@@###getMem_uid ===&gt;&quot;+ re); //getMem_uid를 잘 받는지 확인

           if(re == 1) {//분기처리 
    %&gt;
        &lt;script&gt;
            alert(&quot;글을 등록 하셨습니다.&quot;);
        &lt;/script&gt;
&lt;%
            response.sendRedirect(&quot;list.jsp&quot;); //이동
        }else {
%&gt;
        &lt;script&gt;
            alert(&quot;글 등록에 실패했습니다.&quot;);
        &lt;/script&gt;
&lt;%
            response.sendRedirect(&quot;write.jsp&quot;); //이동
        }

%&gt;</code></pre>
<h3 id="writejsp-1">write.jsp</h3>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;script language=&quot;JavaScript&quot; src=&quot;board.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글올리기&lt;/h1&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt;
            &lt;table align =&quot;center&quot;&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자 &lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot;&gt;
                    &lt;/td&gt;
                    &lt;td width=&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot;size=&quot;24&quot; maxlength=&quot;50&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width =&quot;80&quot;&gt;글제목 &lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;text&quot;name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;  align =&quot;center&quot;&gt;
                    &lt;textarea cols=&quot;65&quot; rows=&quot;10&quot; name=&quot;b_content&quot;&gt;&lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;50&quot; align =&quot;center&quot;&gt;
                    &lt;td colspan = &quot;4&quot; &gt;
                        &lt;input type=&quot;button&quot; value=&quot;글쓰기&quot;  onclick=&quot;check_ok()&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;button&quot; value=&quot;글목록&quot;  onclick=&quot;location.href=&#39;list.jsp&#39;&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="listjsp-2">list.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;java.util.ArrayList&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    BoardDBBean db = BoardDBBean.getInstance();
        //listBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //instance를 db객체로 받음.(getInstace하면 instance가 리턴됨)
    ArrayList&lt;BoardBean&gt; boardList = db.listBoard();
        //listBoard메소드 호출하여 ArrayList로 받음(리턴타입은 ArrayList&lt;BoardBean&gt;)
    String b_name, b_title, b_email, b_content = &quot;&quot;;
    int b_id;
    Timestamp b_date;

    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd hh:mm&quot;);

%&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;게시판에 등록된 글 목록 보기&lt;/h1&gt;
        &lt;table width=&quot;600&quot;&gt;
                &lt;tr&gt;
                    &lt;td align=&quot;right&quot;&gt;
                        &lt;a href=&quot;write.jsp&quot;&gt;글 쓰 기&lt;/a&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;

        &lt;table width=&quot;800&quot; border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
            &lt;!-- &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt; --&gt;
                &lt;tr height=&quot;25&quot;&gt;
                    &lt;td width=&quot;40&quot; align=&quot;center&quot;&gt;번호&lt;/td&gt;
                    &lt;td width=&quot;450&quot; align=&quot;center&quot;&gt;글제목&lt;/td&gt;
                    &lt;td width=&quot;120&quot; align=&quot;center&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;160&quot; align=&quot;center&quot;&gt;작성일&lt;/td&gt;
                &lt;/tr&gt;

        &lt;%    
            for(int i=0; i&lt;boardList.size(); i++){//게시글 갯수만큼 반복
                BoardBean board = boardList.get(i);
                    //ArrayList에 담았던 객체들의 값을 가지고 옴
                    //가지고 올때는 반대방향으로 (listBoard 메소드에서 보낸 값을 반대로 풀면 됨)
                    //포장했던걸 푸는 느낌

                //board객체를 하나씩 풀기    
                b_id = board.getB_id();
                b_name = board.getB_name();
                b_email = board.getB_email();
                b_title = board.getB_title();
                b_content = board.getB_content();
                b_date = board.getB_date();
        %&gt;
                &lt;tr height=&quot;25&quot;
                onmouseout=&quot;this.style.backgroundColor = &#39;#f7f7f7&#39;&quot;
                 onmouseover=&quot;this.style.backgroundColor = &#39;#eeeeef&#39;&quot;&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;%= b_id %&gt;
                    &lt;/td&gt;
                    &lt;td&gt;
                        &lt;a href=&quot;show.jsp?b_id=&lt;%= b_id %&gt;&quot;&gt;
                        &lt;%--쿼리 스트링 사용해서 표현식으로 몇번째에 갈건지 설정 --%&gt;
                            &lt;%= b_title %&gt;
                        &lt;/a&gt;
                    &lt;/td&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;a href=&quot;mailto:&lt;%= b_email %&gt;&quot;&gt;&lt;%= b_name %&gt;&lt;/a&gt;
                    &lt;/td&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;%-- &lt;%= b_date %&gt; --%&gt;
                        &lt;%= sdf.format(b_date) %&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
&lt;%
            }
%&gt;                
            &lt;!-- &lt;/form&gt; --&gt;
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h2 id="1-6ppt">1-6ppt</h2>
<blockquote>
<p>테이블
조회수 컬럼 추가(조회수는 default 0)=&gt;B_HIT NUMBER(5)
BoardBean.java
int 데이터형인 b_hit 조회수 getter, setter 추가
BoardDBBean.java
listBoard() 메소드에 조회수 컬럼 추가
getBoard() 메소드에 조회수 업데이트 및 조회 추가
list.jsp
조회수 추가
show.jsp
글번호를 가지고 BoardBean.java 에서 getBoard() 메소드 로 작성자~조회수까지 조회해서 출력</p>
</blockquote>
<h3 id="boarddbbeanjs-1">BoardDBBean.js</h3>
<pre><code class="language-sql">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
    public int insertBoard(BoardBean board) throws Exception{
        int re = -1;
        int number;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        String sql =&quot;&quot;;

        try {
            conn = getConnection();
            sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;//글번호 추가
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(rs.next()) {//다음 쿼리 데이터가 있는 경우를 조건문으로 줌.
                number = rs.getInt(1)+1;
                //글번호가 가장 큰 값을 조회하여 1증가 한 값을 INSERT쿼리에 추가
            } else {
                number = 1;
            }

            sql = &quot;INSERT INTO BOARDT VALUES (?,?,?,?,?,?)&quot;;
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언

//            데이터가 제대로 들어갔는지 확인 해야함
//            System.out.println(&quot;@@@@#### number=====&gt;&quot;+number);
//            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
//            System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
//            System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
//            System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());
//            System.out.println(&quot;@@@@#### board.getB_date()=====&gt;&quot;+board.getB_date());

            pstmt.setInt(1, number);//인덱스 번호 변경 및 글번호 (number) 추가
            pstmt.setString(2, board.getB_name());
            pstmt.setString(3, board.getB_email());
            pstmt.setString(4, board.getB_title());
            pstmt.setString(5, board.getB_content());
            pstmt.setTimestamp(6, board.getB_date());//날짜 및 시간 저장한걸 추가(setTimestamp)

            pstmt.executeUpdate();
            re = 1;

        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }

        return re;    
    }


    //4. 리턴타입이 ArrayList&lt;BoardBean&gt; 인 listBoard() 메소드 추가(글목록을 위한 메소드)
    public ArrayList&lt;BoardBean&gt; listBoard() throws Exception{//제네릭 사용함 , 파라미터는 BoardBean

        Connection conn = null;//데이터 베이스 접속
        Statement stmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        //db 정보 받기 위함
        String sql = &quot;SELECT b_id\r\n&quot; + 
                    &quot;     , b_name\r\n&quot; + 
                    &quot;     , b_email\r\n&quot; + 
                    &quot;     , b_title\r\n&quot; + 
                    &quot;     , b_content \r\n&quot; + 
                    &quot;     , b_date\r\n&quot; + 
                    &quot;     , b_hit\r\n&quot; + 
                    &quot;  FROM BOARDT \r\n&quot; + 
                    &quot; ORDER BY B_ID&quot;;//해당 데이터 쿼리 정렬되게끔 함.
        ArrayList&lt;BoardBean&gt; boardList = new ArrayList&lt;BoardBean&gt;();//ArrayList로 게시글들을 받음

        try {
            conn = getConnection();
            //pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            stmt = conn.createStatement();// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = stmt.executeQuery(sql);//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리


            while(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                BoardBean board = new BoardBean();
                //결과값을 세팅
                board.setB_id(rs.getInt(1));//아이디는 INT이므로 getInt로 해야함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
                board.setB_date(rs.getTimestamp(6));
                board.setB_hit(rs.getInt(7));//조회수는 INT이므로 getInt로 해야함

//                데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### board.getB_id()=====&gt;&quot;+board.getB_id());
//                System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());

                boardList.add(board);//반복하면서 게시글들을 쌓음

            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(stmt != null)  stmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return boardList;
    }


    // 5. 리턴타입이 BoardBean인 getBoard() 메소드 추가
    public BoardBean getBoard (int bid) throws Exception{//글번호만 넘기면 알아서 내용이 넘어가는 메소드 
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        //db 정보 받기 위함
        BoardBean board = null;
        String sql = &quot;&quot;;//해당 번호의 데이터 출력되게 쿼리 작성

        try {
            conn = getConnection();

            //조회수 업데이트 추가함
            sql = &quot;UPDATE BOARDT SET b_hit=b_hit+1 WHERE b_id=?&quot;;
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
//            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리
            pstmt.executeUpdate();//업데이트니깐 업데이트로 바꿔줌
            //업데이트 추가 끝!



            sql = &quot;SELECT b_id\r\n&quot; + 
                    &quot;    , b_name\r\n&quot; + 
                    &quot;    , b_email\r\n&quot; + 
                    &quot;    , b_title\r\n&quot; + 
                    &quot;    , b_content\r\n&quot; + 
                    &quot;    , b_date\r\n&quot; + 
                    &quot;    , b_hit\r\n&quot; + 
                    &quot; FROM BOARDT\r\n&quot; + 
                    &quot; WHERE b_id=?&quot;;//해당 번호의 데이터 출력되게 쿼리 작성
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음
//             DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            pstmt.setInt(1, bid);//조건이 하나이기 때문에 (?가 하나임)
            rs = pstmt.executeQuery();//select 문이니깐 익스큐트 쿼리




            if(rs.next()) {//다음(여러개의) 쿼리 데이터가 있는 경우를 조건문으로 줌.
                board = new BoardBean();//객체생성(리턴값이 board)
                board.setB_id(rs.getInt(1));
                //board.setB_id(bid);도 가능함
                board.setB_name(rs.getString(2));
                board.setB_email(rs.getString(3));
                board.setB_title(rs.getString(4));
                board.setB_content(rs.getString(5));
                board.setB_date(rs.getTimestamp(6));
                board.setB_hit(rs.getInt(7));
//                
////                데이터가 제대로 들어갔는지 확인 해야함
//                System.out.println(&quot;@@@@#### board.setB_id()=====&gt;&quot;+board.getB_id());
//                System.out.println(&quot;@@@@#### board.setB_name()=====&gt;&quot;+board.getB_name());
//                System.out.println(&quot;@@@@#### board.setB_email()=====&gt;&quot;+board.getB_email());
//                System.out.println(&quot;@@@@#### board.setB_title()=====&gt;&quot;+board.getB_title());
//                System.out.println(&quot;@@@@#### board.setB_content()=====&gt;&quot;+board.getB_content());
            }

        } catch(SQLException ex) {
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null)  rs.close();
                  if(conn != null)  conn.close();
                  if(pstmt != null)  pstmt.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return board;
    }



}</code></pre>
<h3 id="writejsp-2">write.jsp</h3>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;script language=&quot;JavaScript&quot; src=&quot;board.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글올리기&lt;/h1&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt;
            &lt;table align =&quot;center&quot;&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자 &lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot;&gt;
                    &lt;/td&gt;
                    &lt;td width=&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot;size=&quot;24&quot; maxlength=&quot;50&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width =&quot;80&quot;&gt;글제목 &lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;text&quot;name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;  align =&quot;center&quot;&gt;
                    &lt;textarea cols=&quot;65&quot; rows=&quot;10&quot; name=&quot;b_content&quot;&gt;&lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;50&quot; align =&quot;center&quot;&gt;
                    &lt;td colspan = &quot;4&quot; &gt;
                        &lt;input type=&quot;button&quot; value=&quot;글쓰기&quot;  onclick=&quot;check_ok()&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;button&quot; value=&quot;글목록&quot;  onclick=&quot;location.href=&#39;list.jsp&#39;&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="showjsp-2">show.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;

&lt;%
    int bid = Integer.parseInt(request.getParameter(&quot;b_id&quot;));
    //list.jsp에서 &lt;a href=&quot;show.jsp?b_id=..&gt; 에서 b_id가 넘어옴
            //그후 캐스팅!!

    BoardDBBean db = BoardDBBean.getInstance();
        //getBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //getBoard db객체로 받음.(getInstace하면 instance가 리턴됨)
    BoardBean board =db.getBoard(bid);
        //getBoard 메소드 호출하여 BoardBean 받음(리턴타입은 board)

    Timestamp b_date;    


    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd hh:mm&quot;);    
    /* String b_name = &quot;&quot;;
    String b_title  = &quot;&quot;;
    String b_email  = &quot;&quot;;
    String b_content = &quot;&quot;; */
    //오류나서 하나하나 넣어줌


    /* if(board != null){
        int b_id = board.getB_id();
        b_name = board.getB_name();
        b_email = board.getB_email();
        b_title = board.getB_title();
        b_content = board.getB_content();
    } */
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글 내 용 보 기&lt;/h1&gt;
        &lt;table width=&quot;600&quot; border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;글번호&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;
                        &lt;%= bid %&gt;
                    &lt;/td&gt;
                    &lt;td width=&quot;100&quot;&gt;조회수&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;
                        &lt;%= board.getB_hit() %&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;&lt;%= board.getB_name() %&gt;&lt;/td&gt;
                                    &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;

                    &lt;td width=&quot;100&quot;&gt;작성일&lt;/td&gt;
                    &lt;td width=&quot;200&quot;&gt;&lt;%= sdf.format(board.getB_date())  %&gt;&lt;/td&gt;
                                                 &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;
                &lt;/tr&gt;        

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot; &gt;글제목&lt;/td&gt;
                    &lt;td width=&quot;200&quot; align=&quot;left&quot;  colspan = &quot;3&quot;&gt;
                        &lt;%= board.getB_title() %&gt;
                        &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;    

                &lt;tr height=&quot;30&quot; align=&quot;center&quot;&gt;
                    &lt;td width=&quot;100&quot;&gt;글내용&lt;/td&gt;
                    &lt;td width=&quot;200&quot; align=&quot;left&quot;  colspan = &quot;3&quot;&gt;
                        &lt;%= board.getB_content() %&gt;
                        &lt;%-- board 객체를 이용하여 getB_.. 사용! --%&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;        

        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="listjsp-3">list.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;java.text.SimpleDateFormat&quot;%&gt;
&lt;%@page import=&quot;java.sql.Timestamp&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@page import=&quot;magic.board.BoardBean&quot;%&gt;
&lt;%@page import=&quot;java.util.ArrayList&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    BoardDBBean db = BoardDBBean.getInstance();
        //listBoard 메소드를 가지고 와야함(제네릭) 그러기 위해서는 객체생성을 먼저해야함
        //instance를 db객체로 받음.(getInstace하면 instance가 리턴됨)
    ArrayList&lt;BoardBean&gt; boardList = db.listBoard();
        //listBoard메소드 호출하여 ArrayList로 받음(리턴타입은 ArrayList&lt;BoardBean&gt;)
    String b_name, b_title, b_email, b_content = &quot;&quot;;
    int b_id, b_hit;
    Timestamp b_date;

    SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd hh:mm&quot;);
%&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;게시판에 등록된 글 목록 보기&lt;/h1&gt;
        &lt;table width=&quot;600&quot;&gt;
                &lt;tr&gt;
                    &lt;td align=&quot;right&quot;&gt;
                        &lt;a href=&quot;write.jsp&quot;&gt;글 쓰 기&lt;/a&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;

        &lt;table width=&quot;800&quot; border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
            &lt;!-- &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt; --&gt;
                &lt;tr height=&quot;25&quot;&gt;
                    &lt;td width=&quot;40&quot; align=&quot;center&quot;&gt;번호&lt;/td&gt;
                    &lt;td width=&quot;450&quot; align=&quot;center&quot;&gt;글제목&lt;/td&gt;
                    &lt;td width=&quot;120&quot; align=&quot;center&quot;&gt;작성자&lt;/td&gt;
                    &lt;td width=&quot;130&quot; align=&quot;center&quot;&gt;작성일&lt;/td&gt;
                    &lt;td width=&quot;60&quot; align=&quot;center&quot;&gt;조회수&lt;/td&gt;
                &lt;/tr&gt;
        &lt;%    
            for(int i=0; i&lt;boardList.size(); i++){//게시글 갯수만큼 반복
                BoardBean board = boardList.get(i);
                    //ArrayList에 담았던 객체들의 값을 가지고 옴
                    //가지고 올때는 반대방향으로 (listBoard 메소드에서 보낸 값을 반대로 풀면 됨)
                    //포장했던걸 푸는 느낌

                //board객체를 하나씩 풀기    
                b_id = board.getB_id();
                b_name = board.getB_name();
                b_email = board.getB_email();
                b_title = board.getB_title();
                b_content = board.getB_content();
                b_date = board.getB_date();
                b_hit = board.getB_hit();
        %&gt;
                &lt;tr height=&quot;25&quot;
                onmouseout=&quot;this.style.backgroundColor = &#39;#f7f7f7&#39;&quot;
                 onmouseover=&quot;this.style.backgroundColor = &#39;#eeeeef&#39;&quot;&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;%= b_id %&gt;
                    &lt;/td&gt;
                    &lt;td&gt;
                        &lt;a href=&quot;show.jsp?b_id=&lt;%= b_id %&gt;&quot;&gt;
                        &lt;%--쿼리 스트링 사용해서 표현식으로 몇번째에 갈건지 설정 --%&gt;
                            &lt;%= b_title %&gt;
                        &lt;/a&gt;
                    &lt;/td&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;a href=&quot;mailto:&lt;%= b_email %&gt;&quot;&gt;&lt;%= b_name %&gt;&lt;/a&gt;
                    &lt;/td&gt;
                    &lt;td align=&quot;center&quot;&gt;
                        &lt;%-- &lt;%= b_date %&gt; --%&gt;
                        &lt;%= sdf.format(b_date) %&gt;
                    &lt;/td&gt;
                    &lt;td align=&quot;center&quot;&gt; &lt;%-- 열추가  --%&gt;
                        &lt;%= b_hit %&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
        &lt;%
                }
        %&gt;                
            &lt;!-- &lt;/form&gt; --&gt;
        &lt;/table&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.09.01 SQL]]></title>
            <link>https://velog.io/@sofia_777/2022.09.01-SQL</link>
            <guid>https://velog.io/@sofia_777/2022.09.01-SQL</guid>
            <pubDate>Sun, 04 Sep 2022 14:46:05 GMT</pubDate>
            <description><![CDATA[<ol>
<li>평가 시험 풀이
viewEmp.jsp</li>
</ol>
<pre><code class="language-sql">&lt;%@page import=&quot;java.sql.SQLException&quot;%&gt;
&lt;%@page import=&quot;java.sql.ResultSet&quot;%&gt;
&lt;%@page import=&quot;java.sql.Statement&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@page import=&quot;java.sql.DriverManager&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;

&lt;%!
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    String url = &quot;jdbc:oracle:thin:@localhost:1521:xe&quot;;
    String user = &quot;scott&quot;;
    String password = &quot;tiger&quot;;
    String selectQuery = &quot;SELECT * FROM EMP&quot;;
%&gt;      
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;800&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;사원번호&lt;/td&gt;
            &lt;td&gt;사원명&lt;/td&gt;
            &lt;td&gt;직급&lt;/td&gt;
            &lt;td&gt;상관번호&lt;/td&gt;
            &lt;td&gt;입사일자&lt;/td&gt;
            &lt;td&gt;급여&lt;/td&gt;
            &lt;td&gt;커미션&lt;/td&gt;
            &lt;td&gt;부서번호&lt;/td&gt;
        &lt;/tr&gt;
    &lt;%
            try {
                Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
                conn = DriverManager.getConnection(url, user, password);
                stmt = conn.createStatement();
                rs = stmt.executeQuery(selectQuery); //쿼리 결과를 rs로 받음

                while(rs.next()) {
        %&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;empno&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;ename&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;job&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;mgr&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;hiredate&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;sal&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;comm&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;deptno&quot;) %&gt;&lt;/td&gt;

        &lt;/tr&gt;
        &lt;%
                }
            } catch(SQLException ex) {
                ex.getMessage();
            } finally {
                try {
                    if(rs != null) rs.close();
                    if(stmt != null) stmt.close();
                    if(conn != null) conn.close();
                } catch(SQLException ex) {
                    ex.getMessage();
                }
            }
        %&gt;
    &lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<pre><code class="language-sql">&lt;%@page import=&quot;java.sql.DriverManager&quot;%&gt;
&lt;%@page import=&quot;java.sql.SQLException&quot;%&gt;
&lt;%@page import=&quot;java.sql.ResultSet&quot;%&gt;
&lt;%@page import=&quot;java.sql.Statement&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%!
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    String url = &quot;jdbc:oracle:thin:@localhost:1521:xe&quot;;
    String user = &quot;scott&quot;;
    String password = &quot;tiger&quot;;
    StringBuffer selectQuery = new StringBuffer();//객체생성
%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;400&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;컬럼명&lt;/td&gt;
            &lt;td&gt;컬렴형식&lt;/td&gt;
            &lt;td&gt;컬럼길이&lt;/td&gt;
            &lt;td&gt;널값여부&lt;/td&gt;
        &lt;/tr&gt;
        &lt;%
            try {
                String tname = request.getParameter(&quot;table&quot;);
                out.print(&quot;##$#$# tname =&gt; &quot;+tname);
                Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
                conn = DriverManager.getConnection(url, user, password);
                stmt = conn.createStatement();

                selectQuery.append(&quot;SELECT COLUMN_NAME&quot;);
                selectQuery.append(&quot; , DATA_TYPE&quot;);
                selectQuery.append(&quot; , DATA_LENGTH&quot;);
                selectQuery.append(&quot; , NULLABLE&quot;);
                selectQuery.append(&quot; FROM USER_TAB_COLUMNS&quot;);
                selectQuery.append(&quot; WHERE TABLE_NAME = &#39;&quot;+tname+&quot;&#39;&quot;);
                rs = stmt.executeQuery(selectQuery.toString()); //쿼리 결과를 rs로 받음
                selectQuery.setLength(0);
                //가끔 어떤 테이블은 실행이 안되는 경우가 있는데 그럴때 .setLength(0)을 이용하면 됨
                //이전에 입력되었던 값의 초기화 역할(실행전으로 돌아가서 구동되도록 함.)

                while(rs.next()) {
        %&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;COLUMN_NAME&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;DATA_TYPE&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;DATA_LENGTH&quot;) %&gt;&lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;NULLABLE&quot;) %&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;%
                }
            } catch(SQLException ex) {
                ex.getMessage();
            } finally {
                try {
                    if(rs != null) rs.close();
                    if(stmt != null) stmt.close();
                    if(conn != null) conn.close();
                } catch(SQLException ex) {
                    ex.getMessage();
                }
            }
        %&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h3 id="복습-문제1">복습 문제1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/fbfe7dba-4de6-4ef1-a81f-2d4c1ddbaefc/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME
     , POSITION
     , TO_CHAR(PAY,&#39;$999,999,999&#39;) &quot;SALARY&quot;
  FROM EMP2
 WHERE (POSITION,PAY) IN (SELECT POSITION
                               , MAX(PAY)
                            FROM EMP2
                           GROUP BY POSITION)
 ORDER BY 3;</code></pre>
<h1 id="스칼라-서브쿼리scalar-subquery">스칼라 서브쿼리(Scalar Subquery)</h1>
<ul>
<li>SELECT실행문 안에 SELECT절 삽입</li>
<li>속도가 빠름</li>
</ul>
<p><code>SELECT * FROM EMP2;</code>  와 <code>SELECT * FROM DEPT2;</code>를 이용해서 </p>
<pre><code class="language-sql">SELECT E.NAME
     , D.DNAME 
FROM EMP2 E, DEPT2 D
WHERE E.DEPTNO = D.DCODE;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/cd6966e3-1c7d-4985-844f-c414eff8b8a5/image.png" alt=""> 출력
서브쿼리를 이용해서 동일한 결과를 얻을 수있다. 아래 형태를 스칼라 서브쿼리형태라고 함</p>
<pre><code class="language-sql">-- 스칼라 서브쿼리
-- 속도가 빠르게 적용됨
SELECT E.NAME
     , (SELECT D.DNAME 
        FROM DEPT2 D
        WHERE E.DEPTNO = D.DCODE) &quot;DNAME&quot;
FROM EMP2 E;</code></pre>
<p>결과 동일함</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7015bc2d-88cf-4d91-967e-1f714484733d/image.png" alt=""></p>
<pre><code class="language-sql">-- 데이터를 비교해서 보고싶다. 그럼 .*을 사용하면 편함
SELECT E.DEPTNO, E.*
    FROM EMP E
ORDER BY JOB;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b8bb0fb7-19b5-4c37-a82e-b44f369af2d5/image.png" alt=""></p>
<pre><code class="language-sql">SELECT E.DEPTNO, E.JOB , E.SAL, E.*
    FROM EMP E
ORDER BY E.JOB;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/5e396af8-e2b6-4505-88fa-7df1251ff514/image.png" alt=""></p>
<pre><code class="language-sql">SELECT E.DEPTNO, E.JOB , E.SAL, E.*
    FROM EMP E
ORDER BY E.DEPTNO, E.JOB;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8f910304-36be-41af-9c48-f767b7d2d241/image.png" alt=""></p>
<h3 id="예제-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/009f2284-a72c-4252-a052-8a5ee017f6e1/image.png" alt=""></p>
<pre><code class="language-sql">SELECT DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
                                    FROM EMP GROUP BY DEPTNO, JOB
UNION ALL
SELECT DEPTNO, NULL JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
                                    FROM EMP GROUP BY DEPTNO
UNION ALL
SELECT NULL DEPTNO, NULL JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
                                    FROM EMP
                                    ORDER BY DEPTNO, JOB;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/860b95a8-6fe6-4ac2-bb52-308b7b53934d/image.png" alt=""></p>
<h2 id="집계-함수">집계 함수</h2>
<h3 id="roll-up">ROLL UP</h3>
<pre><code class="language-sql">-- ROLLUP (집계함수)                                    
SELECT DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP 
GROUP BY ROLLUP (DEPTNO, JOB);</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ef2ef00b-9578-4dff-93a4-50041610cc76/image.png" alt=""></p>
<h2 id="cube">CUBE</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/23cfa29f-693f-4d5e-85bb-5724808ea04d/image.png" alt=""></p>
<pre><code class="language-sql">SELECT DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
                                    FROM EMP GROUP BY DEPTNO, JOB
UNION ALL
SELECT DEPTNO, NULL JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
                                    FROM EMP GROUP BY DEPTNO
UNION ALL
SELECT NULL DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
                                    FROM EMP
                                    GROUP BY JOB 
UNION ALL
SELECT NULL DEPTNO,  NULL JOB , ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP 
ORDER BY DEPTNO, JOB;</code></pre>
<ul>
<li>CUBE 사용</li>
</ul>
<pre><code class="language-sql">-- CUBE (집계함수)                                    
SELECT DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP 
GROUP BY CUBE (DEPTNO, JOB)
ORDER BY DEPTNO, JOB;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/74b3cd37-f085-4402-8bac-3c2f70a6f94e/image.png" alt=""></p>
<h3 id="grouping-sets">GROUPING SETS</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7e492259-1cde-43f0-beb1-7e29b2aaf2eb/image.png" alt=""></p>
<p>⭐내 방법</p>
<pre><code class="language-sql">SELECT DEPTNO, NULL JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP group by DEPTNO, NULL 
UNION ALL
SELECT NULL DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP group by NULL, JOB 
   ORDER BY DEPTNO,JOB;</code></pre>
<ul>
<li>GROUPING SETS</li>
</ul>
<p>⭐강사님 방법</p>
<pre><code class="language-sql">SELECT DEPTNO, NULL JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP group by DEPTNO
UNION ALL
SELECT NULL DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP group by NULL, JOB 
   ORDER BY DEPTNO,JOB;</code></pre>
<pre><code class="language-sql">SELECT DEPTNO, NULL JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP 
   FROM EMP 
   GROUP BY GROUPING SETS(DEPTNO, JOB)
   ORDER BY DEPTNO,JOB;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/38d903fa-8bee-4258-ba20-b74b484a60b0/image.png" alt=""></p>
<pre><code class="language-sql">SELECT GRADE,
       NULL DEPTNO1,
       COUNT(*),
       SUM(HEIGHT)&quot;TOTAL_HEIGHT&quot;,
       SUM(WEIGHT)&quot;TOTAL_WEIGHT&quot;
   FROM STUDENT group by GRADE
UNION ALL
SELECT NULL GRADE,
       DEPTNO1,
       COUNT(*),
       SUM(HEIGHT)&quot;TOTAL_HEIGHT&quot;,
       SUM(WEIGHT)&quot;TOTAL_WEIGHT&quot;
   FROM STUDENT group by DEPTNO1
   ORDER BY GRADE,DEPTNO1;</code></pre>
<ul>
<li>GROUPING SETS<pre><code class="language-sql">SELECT GRADE,
    DEPTNO1,
    COUNT(*),
    SUM(HEIGHT)&quot;TOTAL_HEIGHT&quot;,
    SUM(WEIGHT)&quot;TOTAL_WEIGHT&quot;
FROM STUDENT  
GROUP BY GROUPING SETS(GRADE, DEPTNO1)
ORDER BY GRADE,DEPTNO1;</code></pre>
</li>
</ul>
<h1 id="procedure--function-프로시저-함수-ppt-12장">PROCEDURE &amp; Function (프로시저&amp; 함수) (PPT 12장)</h1>
<ul>
<li>자주 사용하는 SQL을 프로시저로 만들어 저장한 후, 필요할때마다 사용</li>
<li>데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한 것</li>
</ul>
<ul>
<li><p>장점
네트워크 소요 시간을 줄여 성능을 개선
기능 변경항떄 편함</p>
</li>
<li><p>단점
유지보수가 어려움</p>
</li>
</ul>
<h2 id="1-procedure-생성">1. PROCEDURE 생성</h2>
<pre><code class="language-sql">
CREATE OR REPLACE PROCEDURE 프로시져이름 (파라미터1,파라미터2...);

IS
변수

BEGIN

쿼리문

END 프로시져 이름;</code></pre>
<h3 id="예시">예시</h3>
<ul>
<li>사원 급여 조정 프로시저(수정함)</li>
</ul>
<p>(+) 생성한 후 변경하는 경우도 많아서  <code>CREATE OR REPLACE</code> 를 많이 사용함</p>
<pre><code class="language-sql">
CREATE OR REPLACE PROCEDURE adjust_sal --PROCEDURE명
    (v_flag VARCHAR2  --괄호안에 변수 및 데이터타입 작성 
   , v_empno NUMBER
   , v_pct NUMBER) AS 
BEGIN  --시작 로직
    IF v_flag = &#39;INCREASE&#39; THEN
        UPDATE EMP SET SAL = SAL + (SAL*(v_pct/100))
         WHERE EMPNO = v_empno; --해당되는 사원의 v_flag가 인상되었을 경우의 SAL 변경
    ELSE -- 해당되는 사원의 v_flag가 인상되지 않았을때
         UPDATE EMP SET SAL = SAL - (SAL*(v_pct/100))
         WHERE EMPNO = v_empno;
         --해당되는 사원의 v_flag가 인상되지 않았을 경우의 SAL변경 
    END IF; -- 끝 로직</code></pre>
<p>실행하면  <code>Procedure ADJUST_SAL이(가) 컴파일되었습니다.</code> 라고 적음</p>
<h2 id="2-procedure-실행">2. PROCEDURE 실행</h2>
<pre><code class="language-sql">EXEC adjust_sal(&#39;INCREASE&#39;,7369,10);
EXEC adjust_sal(&#39;&#39;,7369,10);</code></pre>
<h2 id="3-함수funtion-생성">3. 함수(Funtion) 생성</h2>
<ul>
<li>예제 사원 연봉 구하는 함수<pre><code class="language-sql">--  
CREATE OR REPLACE FUNCTION get_annual_sal (v_empno NUMBER)
--  함수 명 및 변수와 데이터 타입 설정
--  RETURN NUMBER IS v_sal NUMBER : = 0; 
--  0은 초기값을 주는것 
--  NUMBER타입의 v_sal를 넘기겠다.
 RETURN NUMBER IS v_sal NUMBER;
BEGIN
 SELECT (SAL + NVL(COMM,0)) * 12 INTO v_sal -- 구하는 함수이므로 SELECT문 사용
   FROM EMP WHERE EMPNO = v_empno;  --조건문: 사원 번호가 v_empno인 사원의
   RETURN v_sal;
END;</code></pre>
</li>
</ul>
<ul>
<li>예제 사원 퇴직급여 구하는 함수
```sql</li>
<li><ul>
<li>사원 퇴직급여 구하는 함수
CREATE OR REPLACE FUNCTION get_retire_sal (v_empno NUMBER)
 RETURN NUMBER IS v_sal NUMBER;
BEGIN
 SELECT ROUND((SAL + NVL(COMM,0)) * ROUND((MONTHS_BETWEEN(SYSDATE, HIREDATE)),0) / 12, 0)
 INTO v_sal
 FROM EMP WHERE EMPNO = v_empno;
 RETURN v_sal;
END;<pre><code></code></pre></li>
</ul>
</li>
</ul>
<h2 id="3-함수funtion-실행">3. 함수(Funtion) 실행</h2>
<pre><code class="language-sql">SELECT get_hiredate(7369,&#39;YYYY-MM-DD&#39;) FROM dual;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/88e4dfc4-1272-4f2e-8b2c-27c9d3deaee9/image.png" alt=""></p>
<pre><code class="language-sql">SELECT EMPNO &quot;사번&quot;
     , ENAME &quot;성명&quot;
     , get_annual_sal(EMPNO) &quot;연봉&quot;
     , get_retire_sal(EMPNO) &quot;퇴직금&quot;
     , get_hiredate(EMPNO,&#39;YYYY-MM-DD&#39;) &quot;입사일&quot;
     FROM EMP;</code></pre>
<p>사용하면 깔끔하게 결과를 구할 수 있다.
<img src="https://velog.velcdn.com/images/sofia_777/post/5ff0730b-8a9d-4c01-aa6a-432c249deaf3/image.png" alt=""></p>
<h2 id="help-함수-도움말">HELP 함수 (도움말)</h2>
<pre><code class="language-sql">-- HELP 함수
CREATE OR REPLACE FUNCTION help (v_module VARCHAR2)--모듈을 함수나 프로시저가 됨
    RETURN VARCHAR2 IS v_usage VARCHAR2(100); --리턴하면서 데이터 크기 지정 가능
BEGIN
    v_usage := v_module || &#39;는(은) 등록되지 않은 모듈입니다.&#39;; -- 초기값 설정
    --조건문
    IF UPPER(v_module) = &#39;ADJUST_SAL&#39; THEN
        v_usage:=&#39;종류: PROC, 사용법 : EXEC adjust_sal(INCREASE|DECREASE, 사번, 증감율)&#39;;
    ELSIF UPPER(v_module) = &#39;GET_ANNUAL_SAL&#39; THEN
        v_usage:=&#39;종류: FUNC, 사용법 : get_annual_sal(사번)&#39;;   
    END IF;
    RETURN v_usage;
END;</code></pre>
<pre><code class="language-sql">SELECT HELP(&#39;adjust_sal&#39;) FROM DUAL;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c602e9bd-d830-480c-b459-83b8cda1bbea/image.png" alt=""></p>
<pre><code class="language-sql">SELECT HELP(&#39;adjust_sal2&#39;) FROM DUAL;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/13eb0a6c-3ce3-4519-a8f5-6ce7bed01893/image.png" alt=""></p>
<h2 id="함수와-프로시저의-차이">함수와 프로시저의 차이</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/009b8ae0-f5fa-45ae-bff3-5d3c84720f91/image.png" alt=""></p>
<h2 id="package">PACKAGE</h2>
<ul>
<li>관련된 PROCEDURE와 Function 그룹지어 생성
헤더와 바디가 존재함</li>
</ul>
<h3 id="header">HEADER</h3>
<p>헤더 부분</p>
<pre><code class="language-sql">create or replace PACKAGE emp_mgmt AS 
   PROCEDURE adjust_sal (v_flag VARCHAR2 , v_empno NUMBER, v_pct NUMBER);
   FUNCTION get_annual_sal (v_empno NUMBER) RETURN NUMBER;
   FUNCTION get_retire_sal (v_empno NUMBER) RETURN NUMBER;
   PROCEDURE remove_emp (v_empno NUMBER);
   FUNCTION get_hiredate (v_empno NUMBER, v_fmt VARCHAR2) RETURN VARCHAR2;
END emp_mgmt;</code></pre>
<h3 id="body">BODY</h3>
<p>바디 부분</p>
<pre><code class="language-sql">CREATE OR REPLACE PACKAGE BODY emp_mgmt AS 
    --사원급여 조정 프로시저
    PROCEDURE adjust_sal
        (v_flag VARCHAR2, v_empno NUMBER, v_pct NUMBER) AS
    BEGIN
        IF v_flag=&#39;INCREASE&#39; THEN 
            UPDATE EMP SET SAL = SAL + (SAL*(v_pct/100))
             WHERE EMPNO = v_empno;
        ELSE
            UPDATE EMP SET SAL = SAL - (SAL*(v_pct/100))
             WHERE EMPNO = v_empno;
        END IF;
    END;

    -- 사원연봉 구하는 함수
    FUNCTION get_annual_sal (v_empno NUMBER)
        RETURN NUMBER IS v_sal NUMBER;
    BEGIN
        SELECT (SAL + NVL(COMM,0)) * 12 INTO v_sal
          FROM EMP WHERE EMPNO = v_empno;
          RETURN v_sal;
    END;

    --사원 퇴직급여 구하는 함수
    FUNCTION get_retire_sal (v_empno NUMBER)
        RETURN NUMBER IS v_sal NUMBER;
    BEGIN
        SELECT ROUND((SAL + NVL(COMM,0)) * ROUND((MONTHS_BETWEEN(SYSDATE, HIREDATE)),0) / 12, 0)
        INTO v_sal
        FROM EMP WHERE EMPNO = v_empno;
        RETURN v_sal;
    END;

    -- 사원 정보 삭제 프로시저
    PROCEDURE remove_emp
        (v_empno NUMBER) AS 
    BEGIN  
        DELETE FROM EMP 
             WHERE EMPNO = v_empno;
    END;

    -- 사원 입사 일자 구하는 함수
    FUNCTION get_hiredate (v_empno NUMBER, v_fmt VARCHAR2)
        RETURN VARCHAR2 IS v_hiredate VARCHAR2(20);
    BEGIN
        SELECT TO_CHAR(hiredate, v_fmt)
            INTO v_hiredate
            FROM EMP WHERE EMPNO = v_empno;
            RETURN v_hiredate; 
    END;
END;</code></pre>
<ul>
<li>실행시<pre><code class="language-sql">EXEC emp_mgmt.adjust_sal(&#39;INCREASE&#39;,7369,10);</code></pre>
<img src="https://velog.velcdn.com/images/sofia_777/post/4db7a488-76b3-4931-8db8-26f9d6d3c161/image.png" alt=""></li>
</ul>
<pre><code class="language-sql">SELECT emp_mgmt.get_hiredate(7369,&#39;YYYY-MM-DD HH24:MI:SS&#39;) FROM DUAL;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/e740511e-3afc-407d-a40b-a0cae0604bd1/image.png" alt=""></p>
<hr>
<h1 id="백업">백업</h1>
<h2 id="계정-전체-백업">계정 전체 백업</h2>
<p>시스템계정으로 접속  scott 계정의 모든 파일들을 백업</p>
<p><code>exp userid=system/1234@xe owner=scott file=d:\backup\scott01.dmp</code>
<img src="https://velog.velcdn.com/images/sofia_777/post/3f8b7ff5-ce4e-4d48-868d-45e41b3f5f25/image.png" alt=""></p>
<p>cmd 창가서</p>
<pre><code class="language-sql">imp userid=system/1234 fromuser=scott touser=scott file=d:\backup\scott01.dmp tables=(dept4)</code></pre>
<p>입력
<img src="https://velog.velcdn.com/images/sofia_777/post/a197de00-09ff-494b-a7eb-ae30fd033eed/image.png" alt=""></p>
<h2 id="테이블-선택해서-백업">테이블 선택해서 백업</h2>
<ol>
<li>교수테이블의 익스포트 로 이동
<img src="https://velog.velcdn.com/images/sofia_777/post/0c83bb0d-a2ce-44bd-b29e-3c1670d60df9/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/29bb7ee7-d749-40f2-bd32-b3036047ece0/image.png" alt=""></li>
</ol>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/382b8047-52ed-4c4b-a4f0-d92143709060/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/06818488-e142-4310-9e4f-4068091aa628/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/f5a31b84-24ca-4ece-a69d-8d75905bee81/image.png" alt=""></p>
<p>생성됨을 확인 할수있음</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/4590678a-f992-4e5d-b940-4b43afc40891/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8f36fc4f-5d18-40c2-b1ba-926a20716b09/image.png" alt=""></p>
<h1 id="레퍼런스">레퍼런스</h1>
<blockquote>
<ul>
<li><a href="https://fomaios.tistory.com/entry/PLSQL-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80Procedure%EB%9E%80-feat-CRUD">https://fomaios.tistory.com/entry/PLSQL-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80Procedure%EB%9E%80-feat-CRUD</a></li>
</ul>
</blockquote>
<ul>
<li><a href="https://mjn5027.tistory.com/47">https://mjn5027.tistory.com/47</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.08.31 JSP]]></title>
            <link>https://velog.io/@sofia_777/2022.08.31-JSP</link>
            <guid>https://velog.io/@sofia_777/2022.08.31-JSP</guid>
            <pubDate>Sun, 04 Sep 2022 14:10:57 GMT</pubDate>
            <description><![CDATA[<p>사용자 관리 이어서</p>
<h2 id="사용자-관리-3-1">사용자 관리 3-1</h2>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ec2d1c3a-f183-47c9-aada-dcedca5f6e5b/image.png" alt=""></p>
<h2 id="mainjsp">main.jsp</h2>
<ul>
<li>여기서 회원정보 변경 클릭시 
memberUpdate.jsp로 이동</li>
</ul>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    if(session.getAttribute(&quot;Member&quot;)== null){
        response.sendRedirect(&quot;login.jsp&quot;);
    }//loginOk에서 session.setAttribute(&quot;Mebmer&quot;, &quot;yes&quot;);가 아닌경우 login.jsp로 보낸다.(튕기게함)

    String uid = (String)session.getAttribute(&quot;uid&quot;);
    String name = (String)session.getAttribute(&quot;name&quot;);

%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;table border=&quot;1&quot; align=&quot;center&quot;&gt;
    &lt;form method=&quot;post&quot; action =&quot;logOut.jsp&quot;&gt;
    &lt;tr&gt;
        &lt;td&gt;안녕하세요. &lt;%= name %&gt;(&lt;%= uid %&gt;)님 &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;
            &lt;input type=&quot;submit&quot; value=&quot;로그아웃&quot;&gt;
            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
            &lt;input type=&quot;button&quot; value=&quot;회원정보변경&quot;
            onclick=&quot;javascript:window.location=&#39;memberUpdate.jsp&#39;&quot;&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="memberupdatejsp">memberUpdate.jsp</h2>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;script language=&quot;JavaScript&quot; src=&quot;script.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;body&gt;
&lt;%

    String uid = (String)session.getAttribute(&quot;uid&quot;);
    String name = (String)session.getAttribute(&quot;name&quot;);

%&gt;

&lt;table  border=&quot;1&quot; align =&quot;center&quot;&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;registerOk.jsp&quot;&gt;
            &lt;tr height=&quot;50&quot;&gt;
                 &lt;td colspan = &quot;2&quot;&gt;
                     &lt;h1&gt;회원 가입 신청&lt;/h1&gt;
                     &#39;*&#39;표시 항목은 필수 입력 항목입니다.
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;User ID&lt;/td &gt;
                 &lt;td&gt;&lt;%=uid %&gt;&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;암호&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;password&quot; size =&quot;20&quot; name=&quot;mem_pwd&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;암호 확인&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;password&quot; size =&quot;20&quot; name=&quot;pwd_check&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;이     름&lt;/td&gt;
                 &lt;td&gt;&lt;%= name %&gt;&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;E-mail&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;30&quot; name=&quot;mem_email&quot; &gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;주     소&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;40&quot;name=&quot;mem_addr&quot;&gt;&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td colspan = &quot;2&quot; align=&quot;center&quot;&gt;
                      &lt;input type=&quot;button&quot; value=&quot;수정&quot; onclick=&quot;update_check_ok()&quot;&gt;
                     &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt;
                     &lt;input type=&quot;button&quot; value=&quot;수정안함&quot; onclick=&quot;javascript:window.location=&#39;login.jsp&#39;&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="scriptjs">script.js</h2>
<ul>
<li>update_check_ok() 추가</li>
</ul>
<pre><code class="language-sql">function check_ok(){
    //if(document.reg_frm.mem_uid.value==&quot;&quot;){
    //if(reg_frm.mem_uid.value==&quot;&quot;){
    if(reg_frm.mem_uid.value.length==0){
        alert(&quot;아이디를 써주세요&quot;);
        reg_frm.mem_uid.focus();
        return;//아이디가 없으면 리턴
    }

    if(reg_frm.mem_uid.value.length &lt; 4){
        alert(&quot;아이디는 4글자이상이어야 합니다.&quot;);
        reg_frm.mem_uid.focus();
        return;//패스워드가  없으면 리턴
    }

    if(reg_frm.mem_pwd.value.length == 0){
        alert(&quot;패스워드는 반드시 입력해야 합니다.&quot;);
        reg_frm.mem_pwd.focus();
        return;//아이디가 없으면 리턴
    }

    if( reg_frm.pwd_check.value != reg_frm.mem_pwd.value){
        alert(&quot;패스워드가 일치하지 않습니다.&quot;);
        reg_frm.pwd_check.focus();
        return;//패스워드가 일치하지 않으면 리턴
    }

    if( reg_frm.mem_name.value.length==0){
        alert(&quot;이름을  써주세요.&quot;);
        reg_frm.mem_name.focus();
        return;//이름가 없으면 리턴
    }

    if( reg_frm.mem_email.value.length==0){
        alert(&quot;Email을  써주세요.&quot;);
        reg_frm.mem_email.focus();
        return;//이름가 없으면 리턴
    }

    document.reg_frm.submit(); //입력값이 조건에 다 맞으면 action=&quot;registerOk.jsp&quot;으로 가겠다.(전송/submit)
}

function update_check_ok(){
    if(upd_frm.mem_pwd.value.length == 0){
        alert(&quot;패스워드는 반드시 입력해야 합니다.&quot;);
        upd_frm.mem_pwd.focus();
        return;//아이디가 없으면 리턴
    }

    if( upd_frm.pwd_check.value != upd_frm.mem_pwd.value){
        alert(&quot;패스워드가 일치하지 않습니다.&quot;);
        upd_frm.pwd_check.focus();
        return;//패스워드가 일치하지 않으면 리턴
    }

    if( upd_frm.mem_email.value.length==0){
        alert(&quot;Email을  써주세요.&quot;);
        upd_frm.mem_email.focus();
        return;//이름가 없으면 리턴
    }

    document.upd_frm.submit();
}</code></pre>
<h2 id="memberdbbeanjava">memberDBBean.java</h2>
<ul>
<li>updateMember()메소드 추가 </li>
</ul>
<pre><code class="language-sql">package magic.member;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MemberDBBean {
    Connection conn = null;
    PreparedStatement pstmt = null;

    //1. 전역 MemberDBBean 객체 레퍼런스를 리턴하는 메소드
    private static MemberDBBean instance = new MemberDBBean();
    //참조변수 instance를 객체로 받아서 사용
    public static MemberDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }



    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 member를 memberT 테이블에 삽입하는 메소드
    public int insertMember(MemberBean member) throws Exception{// MemberBean member(매개변수)객체
        int re = -1;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        String sql = &quot;INSERT INTO MEMBERT VALUES (?,?,?,?,sysdate,?)&quot;;


        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음

            pstmt.setString(1, member.getMem_uid()); 
            //값을 넣기 위해(세팅하기 위해서)사용
            pstmt.setString(2, member.getMem_pwd());
            pstmt.setString(3, member.getMem_name());
            pstmt.setString(4, member.getMem_email());
//            pstmt.setTimestamp(5, member.getMem_regdate());
            pstmt.setString(5, member.getMem_addr());
            pstmt.executeUpdate();//쿼리 실행
            //여기서 sql문은 insert문이기 때문에 executeUpdate();를 사용해야함

            re=1;//쿼리가 정상적으로 실행되었을때, re =1 이 됨.

        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
    }



    //4. 회원 가입시 아이디 중복 확인 할때 사용하는 메소드 
    public int confirmID(String id) throws Exception{//String id를 받아서 사용
            int re = -1;//결과값 분기처리하기 위해서 변수 선언 
            Connection conn = null;//데이터 베이스 접속//dbcp 연결위한 참조변수 선언
            PreparedStatement pstmt = null;// DB에 SQL 전달//SQL문 사용하기 위한 참조변수 선언
            ResultSet rs = null;//조회시 결과값받음 //쿼리결과값 받기 위해서 참조변수 선언
            String sql =&quot;SELECT * FROM MEMBERT WHERE mem_uid = ?&quot;;//쿼리를 변수로 사용

            try {//DB 처리를 위해서 예외발생을 위한 try~catch문 사용
                conn = getConnection();//dbcp 연결해서 conn 참조변수로 받음
                pstmt = conn.prepareStatement(sql);
                //conn 객체에서 prepareStatment 메소드의 매개변수로 쿼리문 사용
                pstmt.setString(1,id); //쿼리 파라미터를 index로 받아서 처리
                rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음
                //select 조회문은 executeQuery 메소드 처리

                //결과를 확인하기 위해서 while(여러개의 결과값) 또는 if문 사용
                if (rs.next()) {
                    re = 1; //id 조회했을 때 중복인 경우
                }else {
                    re = -1; //id 조회했을 때 중복이 아닌 경우
                }
            } catch(SQLException ex) {//쿼리 조회했다가 오류 발생시 
                 System.out.println(&quot;조회 실패&quot;);
                 ex.printStackTrace();
              } finally {
                  try{//자원반납(순서 중요)
                      if(rs != null) rs.close();
                      if(pstmt != null)  pstmt.close();
                      if(conn != null)  conn.close();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
              }
            return re;
    }


    //5. 사용자 인증시 사용하는 메소드
     public int userCheck(String id, String pwd) throws Exception{
        int re = -1;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String db_mem_pwd;
        String sql=&quot;SELECT MEM_PWD FROM MEMBERT WHERE mem_uid = ?&quot;; 

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,id); 
            rs = pstmt.executeQuery();


            if (rs.next()) {//아이디가 일치하는 로우 존재
                db_mem_pwd = rs.getString(&quot;mem_pwd&quot;);

                if(db_mem_pwd.equals(pwd)) {//패스워드도  일치
                    re = 1;                    
                }else {//패스워드가 불일치
                    re = 0;
                }
            }else {//해당 아이디가 존재하지 않음
                re = -1; 
            }
        } catch(SQLException ex) {
             System.out.println(&quot;조회 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null) rs.close();
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
      }

    private String mem_address;

    //6. 아이디가 일치하는 멤버의 정보를 얻어오는 메소드
    public MemberBean getMember(String id) throws Exception{
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

         String sql = &quot;SELECT MEM_UID, MEM_PWD, MEM_NAME, MEM_EMAIL, MEM_REGDATE, MEM_ADDRESS &quot;
                 +&quot;FROM MEMBERT WHERE MEM_UID=?&quot;;

        //*가 아니라 다 적으면 나중에 수정할때 편함
        //재시작하지 않아도 됨.
        MemberBean member=null;

        try{
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();

            //while 또는 if
              if(rs.next()) {//아이디가 일치하는 로우 존재
                member=new MemberBean();
                //가지고 와서 값 setting
                member.setMem_uid(rs.getString(&quot;mem_uid&quot;));
                member.setMem_pwd(rs.getString(&quot;mem_pwd&quot;));
                member.setMem_name(rs.getString(&quot;mem_name&quot;));
                member.setMem_email(rs.getString(&quot;mem_email&quot;));
                member.setMem_regdate(rs.getTimestamp(&quot;mem_regdate&quot;));
                member.setMem_addr(rs.getString(&quot;mem_address&quot;));
              }
        } catch(SQLException ex) {
             System.out.println(&quot;조회 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                 rs.close();
                 pstmt.close();
                 conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return member;
      }


    //7. 회원 정보 테이블내의 특정 행의 값을 변경한다
    public int updateMember(MemberBean member)throws Exception{

        int re = -1;
        Connection conn = null;
        PreparedStatement pstmt = null;

        String sql=&quot;UPDATE MEMBERT SET MEM_PWD=?, MEM_NAME=?, MEM_EMAIL=? , MEM_ADDRESS=? WHERE MEM_UID=?&quot;;

        try{ 
          conn=getConnection();
          pstmt=conn.prepareStatement(sql);
//            하나하나 확인 해봐야함
//          System.out.println(&quot;@@@### member.getMem_pwd() ===&gt;&quot;+member.getMem_pwd());
//          System.out.println(&quot;@@@### member.getMem_name() ===&gt;&quot;+member.getMem_name());
//          System.out.println(&quot;@@@### member.getMem_email() ===&gt;&quot;+member.getMem_email());
//          System.out.println(&quot;@@@### member.getMem_addr() ===&gt;&quot;+member.getMem_addr());
//          System.out.println(&quot;@@@### member.getMem_uid() ===&gt;&quot;+member.getMem_uid());


          pstmt.setString(1, member.getMem_pwd());
          pstmt.setString(2, member.getMem_name());
          pstmt.setString(3, member.getMem_email());
          pstmt.setString(4, member.getMem_addr());
          pstmt.setString(5, member.getMem_uid());

          re = pstmt.executeUpdate();//쿼리 실행
          System.out.println(&quot;@@@### re ===&gt;&quot;+re);

          System.out.println(&quot;변경 성공&quot;);
        }catch (Exception ex) {
            System.out.println(&quot;변경 실패&quot;);
            ex.printStackTrace();
        } finally {
              try{//자원반납(순서 중요)
                 pstmt.close();
                 conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
      }
}</code></pre>
<h2 id="memberupdateokjsp">memberUpdateOk.jsp</h2>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.member.MemberBean&quot;%&gt;
&lt;%@page import=&quot;magic.member.MemberDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;

&lt;jsp:useBean id=&quot;mb&quot; class=&quot;magic.member.MemberBean&quot;&gt;&lt;/jsp:useBean&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;mb&quot;/&gt; 


&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
     String uid = (String)session.getAttribute(&quot;uid&quot;);    
     mb.setMem_uid(uid);// id값을 따로 받아와야함.
     //memberUpdate.jsp에서 id부분은 표현식으로 결과만 나오게 되어있음
     //그러면 실제로 updateMember메소드 실행할 때 uid 값은 받아오지 않아서 null값이 뜬다.
     //그래서 String uid = (String)session.getAttribute(&quot;uid&quot;);으로 받아온 후에
     //자바빈 set으로 id값를 받아온다.

     MemberDBBean manager=MemberDBBean.getInstance();
     int re = manager.updateMember(mb);
     //updateMember 메소드 보면 member객체를 가지고 mb가 나옴
     //여기서 re값을 받는다.//억지로 re =1할 필요 없음


     if(re==1){
%&gt;     
        &lt;script&gt;    
            alert(&quot;입력하신대로 회원 정보가 수정되었습니다.&quot;);
            document.location.href=&quot;main.jsp&quot;;
        &lt;/script&gt;
&lt;%
        }else{ 
%&gt;
        &lt;script&gt;    
            alert(&quot;수정이 실패되었습니다.&quot;);
            history.go(-1);
        &lt;/script&gt;
&lt;%
        } 
%&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="memberupdatejsp-수정-필요">memberUpdate.jsp 수정 필요</h2>
<p> action=&quot;memberUpdateOk.jsp```sql
&lt;%@page import=&quot;magic.member.MemberDBBean&quot;%&gt;
&lt;%@page import=&quot;magic.member.MemberBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
<!DOCTYPE html></p>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<script language="JavaScript" src="script.js" charset="utf-8"></script>
<body>
<%
    /* if(session.getAttribute("Member")== null){
        response.sendRedirect("login.jsp");
    }//loginOk에서 session.setAttribute("Mebmer", "yes");가 아닌경우 login.jsp로 보낸다.(튕기게함) */

<pre><code>String uid = (String)session.getAttribute(&quot;uid&quot;);
//String name = (String)session.getAttribute(&quot;name&quot;);

 MemberDBBean manager= MemberDBBean.getInstance(); //겟인스턴스로 메소드 호출해서 결과 받음
 MemberBean mb = manager.getMember(uid);
 //겟인스턴스로 메소드 호출해서 리턴된 멤버 결과 받을때 mb.getMem_~~식으로 받음</code></pre><p>%&gt;</p>
<table  border="1" align ="center">
        <form name="upd_frm" method="post" action="memberUpdateOk.jsp">
            <tr height="50">
                 <td colspan = "2">
                     <h1>회원 정보 수정</h1>
                     '*'표시 항목은 필수 입력 항목입니다.
                 </td>
             </tr>
             <tr height="30">
                 <td width="80">User ID</td >
                 <td><%= uid %></td>
             </tr>
             <tr height="30">
                 <td width="80">암호</td>
                 <td><input type="password" size ="20" name="mem_pwd">*</td>
             </tr>
             <tr height="30">
                 <td width="80">암호 확인</td>
                 <td><input type="password" size ="20" name="pwd_check">*</td>
             </tr>
             <tr height="30">
                 <td width="80">이     름</td>
                 <td><input type="text" size ="20" name="mem_name" value="<%= mb.getMem_name() %>">*</td>
             </tr>
             <tr height="30">
                 <td width="80">E-mail</td>
                 <td><input type="text" size ="30" name="mem_email" value="<%= mb.getMem_email() %>" >*</td>
             </tr>
             <tr height="30">
                 <td width="80">주     소</td>
                 <td><input type="text" size ="40"name="mem_addr"  value="<%= mb.getMem_addr() %>"></td>
             </tr>
             <tr>
                 <td colspan = "2" align="center">
                      <input type="submit" value="수정" onclick="update_check_ok()">
                     <input type="reset" value="다시입력">
                     <input type="button" value="수정안함" onclick="javascript:window.location='login.jsp'">
                 </td>
             </tr>
        </form>
    </table>
</body>
</html>
```

<pre><code class="language-sql">&lt;%@page import=&quot;magic.member.MemberDBBean&quot;%&gt;
&lt;%@page import=&quot;magic.member.MemberBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;script language=&quot;JavaScript&quot; src=&quot;script.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;body&gt;
&lt;%
    /* if(session.getAttribute(&quot;Member&quot;)== null){
        response.sendRedirect(&quot;login.jsp&quot;);
    }//loginOk에서 session.setAttribute(&quot;Mebmer&quot;, &quot;yes&quot;);가 아닌경우 login.jsp로 보낸다.(튕기게함) */

    String uid = (String)session.getAttribute(&quot;uid&quot;);
    //String name = (String)session.getAttribute(&quot;name&quot;);

     MemberDBBean manager= MemberDBBean.getInstance(); //겟인스턴스로 메소드 호출해서 결과 받음
     MemberBean mb = manager.getMember(uid);
     //겟인스턴스로 메소드 호출해서 리턴된 멤버 결과 받을때 mb.getMem_~~식으로 받음

%&gt;

&lt;table  border=&quot;1&quot; align =&quot;center&quot;&gt;
        &lt;form name=&quot;upd_frm&quot; method=&quot;post&quot; action=&quot;memberUpdateOk.jsp&quot;&gt;
            &lt;tr height=&quot;50&quot;&gt;
                 &lt;td colspan = &quot;2&quot;&gt;
                     &lt;h1&gt;회원 정보 수정&lt;/h1&gt;
                     &#39;*&#39;표시 항목은 필수 입력 항목입니다.
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;User ID&lt;/td &gt;
                 &lt;td&gt;&lt;%= uid %&gt;&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;암호&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;password&quot; size =&quot;20&quot; name=&quot;mem_pwd&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;암호 확인&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;password&quot; size =&quot;20&quot; name=&quot;pwd_check&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;이     름&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;20&quot; name=&quot;mem_name&quot; value=&quot;&lt;%= mb.getMem_name() %&gt;&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;E-mail&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;30&quot; name=&quot;mem_email&quot; value=&quot;&lt;%= mb.getMem_email() %&gt;&quot; &gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;주     소&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;40&quot;name=&quot;mem_addr&quot;  value=&quot;&lt;%= mb.getMem_addr() %&gt;&quot;&gt;&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td colspan = &quot;2&quot; align=&quot;center&quot;&gt;
                      &lt;input type=&quot;submit&quot; value=&quot;수정&quot; onclick=&quot;update_check_ok()&quot;&gt;
                     &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt;
                     &lt;input type=&quot;button&quot; value=&quot;수정안함&quot; onclick=&quot;javascript:window.location=&#39;login.jsp&#39;&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h1 id="게시판">게시판</h1>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/01e4899e-92ef-4cd1-9986-bdcca9b3ebeb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/84331ce1-2fb1-4fe9-865d-c4847147a551/image.png" alt=""></p>
<ul>
<li>CRTL+SHIFT+O
: 안쓰는 import 삭제</li>
</ul>
<aside>
💡 write.jsp
post 방식으로 write_ok.jsp 호출//

<p>magic.board 패키지에 BoardBean.java
작성자, 이메일주소, 글 제목, 글 내용 프로퍼티 및 getter, setter//</p>
<p>magic.board 패키지에 BoardDBBean.java
값을 저장하는 insertBoard 메소드 생성</p>
<p>write_ok.jsp
write.jsp 에서 넘어온 값을 BoardBean 자바빈에 값을 저장
BoardBean 자바빈의 값을 가지고 BoardDBBean 자바빈의 insertBoard 메소드 호출</p>
</aside>



<h2 id="1단계">1단계</h2>
<h3 id="wirtejsp">wirte.jsp</h3>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글올리기&lt;/h1&gt;
        &lt;form name=&quot;form&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt;
            &lt;table align =&quot;center&quot;&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자 &lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot;&gt;
                    &lt;/td&gt;
                    &lt;td  =&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot;size=&quot;24&quot; maxlength=&quot;50&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width =&quot;80&quot;&gt;글제목 &lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;text&quot;name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;  align =&quot;center&quot;&gt;
                    &lt;textarea cols=&quot;65&quot; rows=&quot;10&quot; name=&quot;b_content&quot;&gt;&lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;50&quot; align =&quot;center&quot;&gt;
                    &lt;td colspan = &quot;4&quot; &gt;
                        &lt;input type=&quot;submit&quot; value=&quot;글쓰기&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>처음에 name이 없으면 위의 사진처럼 데이터값을 받지 못한다.</p>
<p>그래서 write.jsp의 <code>input</code> 부분에  name=&quot;b_content&quot;   name=&quot;b_email&quot; name=&quot;b_title&quot;  name=&quot;b_name&quot;를 추가하여 입력</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/2fd887d4-8843-4546-b636-ff5b1f94782f/image.png" alt="">
<img src="https://velog.velcdn.com/images/sofia_777/post/5364183e-25c8-44e1-bfc9-b1eb1626a2a2/image.png" alt=""></p>
<h3 id="boardbeanjava">BoardBean.java</h3>
<pre><code class="language-sql">package magic.board;

public class BoardBean {
    private String b_name;
    private String b_email;
    private String b_title;
    private String b_content;

    public String getB_name() {
        return b_name;
    }
    public void setB_name(String b_name) {
        this.b_name = b_name;
    }
    public String getB_email() {
        return b_email;
    }
    public void setB_email(String b_email) {
        this.b_email = b_email;
    }
    public String getB_title() {
        return b_title;
    }
    public void setB_title(String b_title) {
        this.b_title = b_title;
    }
    public String getB_content() {
        return b_content;
    }
    public void setB_content(String b_content) {
        this.b_content = b_content;
    }

}</code></pre>
<h3 id="boarddbbeanjava">BoardDBBean.java</h3>
<pre><code class="language-sql">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
    public int insertBoard(BoardBean board) throws Exception{
        int re = -1;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        String sql = &quot;INSERT INTO BOARDT VALUES (?,?,?,?)&quot;;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_email());
            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_title());
            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_content());


            pstmt.setString(1, board.getB_name());
            pstmt.setString(2, board.getB_email());
            pstmt.setString(3, board.getB_title());
            pstmt.setString(4, board.getB_content());
            pstmt.executeUpdate();
            re =1;

        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }

        return re;

    }
}</code></pre>
<h3 id="wirte_okjsp">wirte_ok.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.board.BoardDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;jsp:useBean id=&quot;board&quot; class=&quot;magic.board.BoardBean&quot;/&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;board&quot;/&gt;    

&lt;%
        BoardDBBean db = BoardDBBean.getInstance();
                //instance를 db객체로 받음.
        db.insertBoard(board);
    %&gt;</code></pre>
<h2 id="2단계">2단계</h2>
<ul>
<li>자바스크립트, 글번호 추가
<img src="https://velog.velcdn.com/images/sofia_777/post/66c2fe21-286c-4b9f-98d8-4eb1840dbe26/image.png" alt=""><aside>
💡 board.js
check_ok() 함수
작성자, 글 제목, 글 내용 validation(필수)
Document.form.submit();

</li>
</ul>
<p>Write.jsp
글쓰기 버튼의 type 을 button 으로 변경하고 onclick 속성에 check_ok() 함수 호출
head 태그 안에 자바스크립트 board.js 추가</p>
<p>BoardBean.java
글 번호 프로퍼티 및 getter, setter 추가</p>
<p>BoardDBBean.java
글번호가 가장 큰 값을 조회해서 1증가 한 값을 insert 구분에 추가</p>
</aside>


<h3 id="boardjs">board.js</h3>
<pre><code class="language-sql">function check_ok(){

    if(reg_frm.b_name.value.length==0){
        alert(&quot;이름을 써주세요.&quot;);
        reg_frm.b_name.focus();
        return;//아이디가 없으면 리턴
    }

    if(reg_frm.b_title.value.length==0){
        alert(&quot;제목을 써주세요.&quot;);
        reg_frm.b_title.focus();
        return;//아이디가 없으면 리턴
    }
    if(reg_frm.b_content.value.length==0){
        alert(&quot;내용을 써주세요.&quot;);
        reg_frm.b_content.focus();
        return;//아이디가 없으면 리턴
    }


    document.reg_frm.submit(); //입력값이 조건에 다 맞으면 action=&quot;write_ok.jsp&quot;으로 가겠다.(전송/submit)
}</code></pre>
<h3 id="writejsp">Write.jsp</h3>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;script language=&quot;JavaScript&quot; src=&quot;board.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;center&gt;
        &lt;h1&gt;글올리기&lt;/h1&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;write_ok.jsp&quot;&gt;
            &lt;table align =&quot;center&quot;&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width=&quot;80&quot;&gt;작성자 &lt;/td&gt;
                    &lt;td width=&quot;140&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_name&quot; size=&quot;10&quot; maxlength=&quot;20&quot;&gt;
                    &lt;/td&gt;
                    &lt;td  =&quot;80&quot;&gt;이메일&lt;/td&gt;
                    &lt;td width=&quot;240&quot;&gt;
                        &lt;input type=&quot;text&quot; name=&quot;b_email&quot;size=&quot;24&quot; maxlength=&quot;50&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;30&quot;&gt;
                    &lt;td width =&quot;80&quot;&gt;글제목 &lt;/td&gt;
                    &lt;td colspan=&quot;3&quot; width=&quot;460&quot;&gt;
                        &lt;input type=&quot;text&quot;name=&quot;b_title&quot; size=&quot;55&quot; maxlength=&quot;80&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td colspan=&quot;4&quot;  align =&quot;center&quot;&gt;
                    &lt;textarea cols=&quot;65&quot; rows=&quot;10&quot; name=&quot;b_content&quot;&gt;&lt;/textarea&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr height =&quot;50&quot; align =&quot;center&quot;&gt;
                    &lt;td colspan = &quot;4&quot; &gt;
                        &lt;input type=&quot;button&quot; value=&quot;글쓰기&quot;  onclick=&quot;check_ok()&quot;&gt; &amp;nbsp;
                         &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="boardbeanjava-1">BoardBean.java</h3>
<pre><code class="language-sql">package magic.board;

public class BoardBean {
    private int b_id;
    private String b_name;
    private String b_email;
    private String b_title;
    private String b_content;


    public int getB_id() {
        return b_id;
    }
    public void setB_id(int b_id) {
        this.b_id = b_id;
    }
    public String getB_name() {
        return b_name;
    }
    public void setB_name(String b_name) {
        this.b_name = b_name;
    }
    public String getB_email() {
        return b_email;
    }
    public void setB_email(String b_email) {
        this.b_email = b_email;
    }
    public String getB_title() {
        return b_title;
    }
    public void setB_title(String b_title) {
        this.b_title = b_title;
    }
    public String getB_content() {
        return b_content;
    }
    public void setB_content(String b_content) {
        this.b_content = b_content;
    }

}</code></pre>
<h3 id="boarddbbeanjava-1">BoardDBBean.java</h3>
<pre><code class="language-sql">package magic.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {

    //1. 전역 BoardDBBean 객체 레퍼런스를 리턴하는 메소드
    private static BoardDBBean instance = new BoardDBBean();
    public static BoardDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }

    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public  Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 BoardBean board를 BOARDT 테이블에 삽입하는 메소드
    public int insertBoard(BoardBean board) throws Exception{
        int re = -1;
        int number;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;
        String sql =&quot;&quot;;

        try {
            conn = getConnection();
            sql = &quot;SELECT MAX(B_ID) FROM BOARDT&quot;;//글번호 추가
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언
            rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음(select 조회문은 executeQuery 메소드 처리

            if(rs.next()) {//다음 쿼리 데이터가 있는 경우를 조건문으로 줌.
                number = rs.getInt(1)+1;
                //글번호가 가장 큰 값을 조회하여 1증가 한 값을 INSERT쿼리에 추가
            } else {
                number = 1;
            }



            sql = &quot;INSERT INTO BOARDT VALUES (?,?,?,?,?)&quot;;
            pstmt = conn.prepareStatement(sql);// DB에 SQL 전달(SQL문 사용하기 위한 참조변수 선언

//            데이터가 제대로 들어갔는지 확인 해야함
            System.out.println(&quot;@@@@#### number=====&gt;&quot;+number);
            System.out.println(&quot;@@@@#### board.getB_name()=====&gt;&quot;+board.getB_name());
            System.out.println(&quot;@@@@#### board.getB_email()=====&gt;&quot;+board.getB_email());
            System.out.println(&quot;@@@@#### board.getB_title()=====&gt;&quot;+board.getB_title());
            System.out.println(&quot;@@@@#### board.getB_content()=====&gt;&quot;+board.getB_content());

            pstmt.setInt(1, number);//인덱스 번호 변경 및 글번호 (number) 추가
            pstmt.setString(2, board.getB_name());
            pstmt.setString(3, board.getB_email());
            pstmt.setString(4, board.getB_title());
            pstmt.setString(5, board.getB_content());

            pstmt.executeUpdate();
            re =1;



        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }

        return re;

    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/226a622f-e922-41b3-bd8a-2992c485d699/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.08.30 SQL]]></title>
            <link>https://velog.io/@sofia_777/2022.08.30-SQL</link>
            <guid>https://velog.io/@sofia_777/2022.08.30-SQL</guid>
            <pubDate>Sun, 04 Sep 2022 13:54:42 GMT</pubDate>
            <description><![CDATA[<h1 id="view">VIEW</h1>
<h2 id="1-인덱스-생성-안됨">1. 인덱스 생성 안됨</h2>
<pre><code class="language-sql">CREATE INDEX IDX_V_EMP1_ENAME(인덱스명)
ON V_EMP1(ENAME)(테이블명(칼럼명));</code></pre>
<h2 id="2-단순-뷰simple-view와-복합-뷰complex-view">2. 단순 뷰(Simple View)와 복합 뷰(Complex View)</h2>
<pre><code class="language-sql">--단순 뷰(Simple View)
CREATE OR REPLACE FORCE VIEW &quot;SCOTT&quot;.&quot;V_MEP1&quot; (&quot;EMPNO&quot;,&quot;ENAME&quot;,&quot;HIREDATE&quot;,&quot;DEPTNO&quot;)AS
 SELECT EMPNO, ENAME, HIREDATE, DEPTNO
 FROM EMP;
//테이블 하나

--복합 뷰(Complex View)
CREATE OR REPLACE VIEW V_EMP2
AS
SELECT E.EMPNO,
       D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
//테이즐 2개</code></pre>
<h3 id="예제1">예제1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/cbec4b20-e5a6-4d2b-b363-230ca1eea240/image.png" alt=""></p>
<p>⭐ 내가 한 방법</p>
<pre><code class="language-sql">SELECT D.DEPTNO,
       D.DNAME,
       MAX(E.SAL) AS SAL
FROM EMP E JOIN DEPT D 
ON E.DEPTNO = D.DEPTNO 
group by D.DEPTNO, D.DNAME;</code></pre>
<p>⭐ 강사님 방법(인라인 뷰)</p>
<pre><code class="language-sql">--인라인 뷰(INLINE VIEW)
SELECT E.DEPTNO, D.DNAME, E.SAL
FROM (SELECT DEPTNO, MAX(SAL) SAL
        FROM EMP
        GROUP BY DEPTNO
        )E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;</code></pre>
<h2 id="인라인-뷰inline-view">인라인 뷰(INLINE VIEW)</h2>
<p>인라인 뷰</p>
<pre><code class="language-sql">--인라인 뷰(INLINE VIEW)
SELECT E.DEPTNO, D.DNAME, E.SAL
FROM (SELECT DEPTNO, MAX(SAL) SAL
        FROM EMP
        GROUP BY DEPTNO
        )E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

### 예제2


문제 2

`SELECT DEPTNO, PROFNO, NAME FROM PROFESSOR;` 를 이용하여 그림과 같이 나타내라
![](https://velog.velcdn.com/images/sofia_777/post/f22e5ae2-9ad0-4806-9e2b-33c068e43d5a/image.png)

⭐ 내방법

```sql
SELECT DECODE(LAG(DEPTNO)OVER(ORDER BY DEPTNO)
                             ,DEPTNO,NULL,DEPTNO)&quot;DEPTNO&quot;,
       PROFNO, 
       NAME 
FROM PROFESSOR;</code></pre>
<p>⭐ 강사님 방법</p>
<pre><code class="language-sql">SELECT DECODE(DEPTNO,NDEPTNO,NULL,DEPTNO) &quot;DEPTNO&quot;
      ,PROFNO
      ,NAME 
FROM (SELECT LAG(DEPTNO)OVER(ORDER BY DEPTNO)NDEPTNO,
       DEPTNO,
       PROFNO, 
       NAME
       FROM PROFESSOR
);</code></pre>
<h3 id="예제3">예제3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/96549279-6b96-4c45-86d4-0aaa9b4b33a2/image.png" alt=""></p>
<p>PROFESSOR 테이블과 DEPARTMENT 테이블을 JOIN하여 교수번호와 교수명, 소속 학과이름을 조회하는 VIEW를 생성하시오.(VIEW이름은 V_PROF_DEPT)</p>
<p>⭐ 내방법</p>
<pre><code class="language-sql">CREATE OR REPLACE VIEW V_PROF_DEPT
AS
SELECT P.PROFNO,
       P.NAME,
       D.DNAME
FROM PROFESSOR P, DEPARTMENT D
WHERE P.DEPTNO = D.DEPTNO;</code></pre>
<p>⭐ 교수님 방법</p>
<pre><code class="language-sql">CREATE OR REPLACE VIEW V_PROF_DEPT
AS
SELECT P.PROFNO &quot;교수번호&quot;,
       P.NAME &quot;교수명&quot;,
       D.DNAME &quot;소속학과명&quot;
FROM PROFESSOR P, DEPARTMENT D
WHERE P.DEPTNO = D.DEPTNO;</code></pre>
<h3 id="예제4">예제4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/42e5dae7-209b-4a12-83d4-340c098ff01f/image.png" alt=""></p>
<p>⭐ 내방법(인라인뷰 아님)</p>
<pre><code class="language-sql">SELECT D.DNAME,
       MAX(S.HEIGHT) AS MAX_HEIGHT,
       MAX(S.WEIGHT) AS MAX_WEIGHT
FROM STUDENT S JOIN DEPARTMENT D
ON S.DEPTNO1 = D.DEPTNO  group by D.DNAME;</code></pre>
<p>⭐ 교수님 방법</p>
<pre><code class="language-sql">SELECT D.DNAME,
       S.MAX_HEIGHT,
       S.MAX_WEIGHT
FROM (SELECT DEPTNO1, MAX(HEIGHT) MAX_HEIGHT ,MAX(WEIGHT) MAX_WEIGHT
        FROM STUDENT group by DEPTNO1
        )S, DEPARTMENT D
WHERE S.DEPTNO1 = D.DEPTNO;</code></pre>
<h3 id="예제5">예제5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/3a68d993-ab38-449a-90fa-538b5de1a057/image.png" alt=""></p>
<pre><code class="language-sql">SELECT D.DNAME,
       A.MAX_HEIGHT,
       S.NAME,
       S.HEIGHT
FROM (SELECT DEPTNO1
           , MAX(HEIGHT) MAX_HEIGHT
     FROM STUDENT group by DEPTNO1) A, STUDENT S, DEPARTMENT D
WHERE S.DEPTNO1 = A.DEPTNO1
AND S.HEIGHT = A.MAX_HEIGHT
AND S.DEPTNO1 = D.DEPTNO;</code></pre>
<h3 id="예제6">예제6</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/bc8465b6-1ef1-4a44-a8a4-4d73c06d76c0/image.png" alt=""></p>
<p>⭐ 내방법</p>
<pre><code class="language-sql">SELECT A.GRADE,
       S.NAME,
       S.HEIGHT,
       A.AVG_HEIGHT
FROM (SELECT GRADE
           , AVG(HEIGHT) AVG_HEIGHT
     FROM STUDENT GROUP BY GRADE) A, STUDENT S
WHERE S.GRADE = A.GRADE
AND S.HEIGHT &gt; A.AVG_HEIGHT
ORDER BY A.GRADE ASC;</code></pre>
<p>⭐ 강사님 방법</p>
<pre><code class="language-sql">SELECT S.GRADE,
       S.NAME,
       S.HEIGHT,
       A.AVG_HEIGHT
FROM (SELECT GRADE
           , AVG(HEIGHT) AVG_HEIGHT
     FROM STUDENT GROUP BY GRADE) A, STUDENT S
WHERE S.GRADE = A.GRADE
AND S.HEIGHT &gt; A.AVG_HEIGHT
ORDER BY 1;</code></pre>
<h3 id="예제7">예제7</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/185fd03b-dcc9-4718-a172-b9734a13eb85/image.png" alt=""></p>
<p>⭐내 방법</p>
<pre><code class="language-sql">SELECT A.Ranking,
       A.NAME,
       B.PAY
FROM (SELECT NAME, RANK()OVER(ORDER BY PAY DESC) Ranking
     FROM PROFESSOR) A, PROFESSOR B
WHERE A.NAME = B.NAME
AND Ranking&lt;6 ORDER BY RANKING;</code></pre>
<p>⭐강사님 방법</p>
<pre><code class="language-sql">SELECT rownum &quot;Ranking&quot;
,NAME, PAY
FROM (SELECT NAME
           , PAY
        FROM PROFESSOR
        ORDER BY 2 DESC)
WHERE ROWNUM BETWEEN 1 AND 5;</code></pre>
<hr>
<h1 id="sequenceppt-11장">SEQUENCE(PPT 11장)</h1>
<h2 id="sequence생성">SEQUENCE생성</h2>
<pre><code class="language-sql">CREATE SEQUENCE JNO_SEQ
INCREMENT BY 1
START WITH 100
MAXVALUE 110
MINVALUE 90
CYCLE
CACHE 2;</code></pre>
<pre><code class="language-sql">SELECT JNO_SEQ.CURRVAL FROM DUAL; --100,101,102
-- CURRVAL : 현재 값을 알려줌
SELECT JNO_SEQ.NEXTVAL FROM DUAL; --100,101,102
-- NEXTVAL : 다음값을 알려줌</code></pre>
<h2 id="sequence-변경">SEQUENCE 변경</h2>
<pre><code class="language-sql">--시퀀스 변경
ALTER SEQUENCE JNO_SEQ
MAXVALUE 120 --최댓값변경
NOCYCLE  --반복X
CACHE 10; --캐시사이즈</code></pre>
<h2 id="sequence-삭제">SEQUENCE 삭제</h2>
<pre><code class="language-sql">--시퀀스 삭제
DROP SEQUENCE JNO_SEQ;</code></pre>
<h2 id="synonym">SYNONYM</h2>
<p>동의어
생성시 권한 필요!!!</p>
<ul>
<li>CMD  창 쳐서 
<code>sqlplus / as sysdba</code> : 시스템 계정으로 접속 </li>
</ul>
<p><code>grant create synonym to scott;</code> 입력</p>
<p>cott계정에게 synonym 를 생성할 수있는 권한을 부여</p>
<pre><code class="language-sql">CREATE SYNONYM E FOR EMP;  --  SYNONYM : 동의어

SELECT * FROM E;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ba13c518-e0a1-45b0-b210-9efd9134e73d/image.png" alt=""></p>
<p>데이터 사전으로 확인</p>
<pre><code class="language-sql">-- 데이터 사전으로 확인 
SELECT * FROM USER_SYNONYMS;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ed5ddd61-87ea-4f01-90d8-d07a82660e62/image.png" alt=""></p>
<ul>
<li>SYNONYM 삭제</li>
</ul>
<pre><code class="language-sql">-- SYNONYM 삭제
DROP SYNONYM E;</code></pre>
<h1 id="sub-queryppt-10장">Sub Query(PPT 10장)</h1>
<p>: 조건절 안에 괄호으로 들어온 쿼리</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/71e7aef7-745e-417b-b6f3-ddba8634f0f1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/efb0c1f5-322c-482b-bb23-922005dbc802/image.png" alt=""></p>
<p>보통 인라인 뷰로 많이 사용</p>
<h2 id="연산자-종류">연산자 종류</h2>
<ul>
<li><p>=,&lt;&gt;,&gt;,&gt;=,&lt;,&lt;=</p>
</li>
<li><p>IN, EXISTS, &gt;ANY , &lt;ANY, &lt;ALL, &gt;ALL</p>
</li>
</ul>
<blockquote>
<p><code>&gt;ANY 최소값보다 큰</code>
<code>&lt;ALL 최소값보다 작은</code>
<code>&lt;ANY 최대값보다 작다</code>
<code>&gt;ALL 최대값보다 크다.</code></p>
</blockquote>
<h3 id="예제-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/3f766cbf-543b-4221-9141-224972ef0c04/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME,
       POSITION,
       TO_CHAR(PAY,&#39;$999,999,999&#39;) &quot;SALARY&quot;
       FROM EMP2 A WHERE PAY &gt;= (SELECT AVG(PAY)
                     FROM EMP2 B
       WHERE A.POSITION = B.POSITION);</code></pre>
<h3 id="예제-2">예제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/26a60ec7-a2d4-4dbf-a32d-ef456e9e5299/image.png" alt=""></p>
<pre><code class="language-sql">SELECT S.NAME &quot;STUD_NAME&quot;
     , D.DNAME &quot;DEPT_NAME&quot;
  FROM STUDENT S, DEPARTMENT D
 WHERE S.DEPTNO1 = D.DEPTNO  
 AND S.DEPTNO1 = (SELECT DEPTNO1
                      FROM STUDENT S
                  WHERE NAME=&#39;Anthony Hopkins&#39;);</code></pre>
<h3 id="예제-3">예제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8749834c-bf22-4bff-86b1-6926e0b441b1/image.png" alt=""></p>
<pre><code class="language-sql">SELECT P.NAME &quot;PROF_NAME&quot;,
       P.HIREDATE,
       D.DNAME &quot;DEPT_NAME&quot;
  FROM PROFESSOR P, DEPARTMENT D
 WHERE P.DEPTNO = D.DEPTNO  
 AND P.HIREDATE &gt; (SELECT HIREDATE
                      FROM PROFESSOR P
                  WHERE NAME=&#39;Meg Ryan&#39;);</code></pre>
<h3 id="예제-4">예제 4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/63d3c7d2-b905-40b9-bdc7-083ca51f91d0/image.png" alt=""></p>
<p>⭐ 내방법</p>
<pre><code class="language-sql">SELECT NAME,
       WEIGHT
  FROM STUDENT A
 WHERE A.WEIGHT &gt; (SELECT AVG(WEIGHT)
                      FROM STUDENT B
                  WHERE DEPTNO1 = 201);</code></pre>
<p>⭐ 강사님 방법</p>
<pre><code class="language-sql">SELECT NAME,
       WEIGHT
  FROM STUDENT
 WHERE WEIGHT &gt; (SELECT AVG(WEIGHT)
                      FROM STUDENT
                  WHERE DEPTNO1 = 201);</code></pre>
<h1 id="입력창">입력창</h1>
<h2 id="dno">&amp;DNO</h2>
<pre><code class="language-sql">SELECT DEPTNO
FROM DEPT
WHERE DEPTNO = &amp;DNO;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/c2a461e7-5350-41ce-920b-bdfd586a8961/image.png" alt="">
입력창에 10입력 </p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b4919ec0-9321-4969-b1c2-06aeb4774888/image.png" alt=""></p>
<pre><code class="language-sql">SELECT *
FROM DEPT
WHERE DEPTNO =(SELECT DEPTNO
                FROM DEPT
                WHERE DEPTNO = &amp;DNO);</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/4066b7f9-0d17-4964-9473-8373c122c0d8/image.png" alt=""></p>
<p>서브 쿼리로도 입력 받을 수있음
<img src="https://velog.velcdn.com/images/sofia_777/post/224caccb-5379-414f-82c4-cbe8763a3bfd/image.png" alt=""></p>
<h1 id="-exists">++ EXISTS</h1>
<pre><code class="language-sql">-- EXISTS 
SELECT *
FROM DEPT
WHERE EXISTS (SELECT DEPTNO
                FROM DEPT
                WHERE DEPTNO = &amp;DNO);</code></pre>
<p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e5c99723-0701-48fc-8c2d-f25ec9bf1b7e/Untitled.png" alt="Untitled"></p>
<pre><code class="language-sql">EXISTS(): 서브 쿼리의 결과가 &quot;한 건이라도 존재하면&quot; TRUE, 없으면 FALSE를 리턴
여기서는 앞의 쿼리가 SELECT * FROM DEPT이므로 모든 데이터를 출력함</code></pre>
<h3 id="예제-1-1">예제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/83a09d0e-955e-4d95-858d-17e14c750e2d/image.png" alt=""></p>
<pre><code class="language-sql">SELECT EMPNO,
       NAME,
       DEPTNO
FROM EMP2 
WHERE DEPTNO IN (SELECT DCODE
                FROM DEPT2
                WHERE AREA = &#39;Pohang Main Office&#39;);</code></pre>
<h3 id="예제-2-1">예제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/0008bbfe-75c3-440d-b82e-83552e2228f1/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME,
       POSITION,
       TO_CHAR(PAY,&#39;$999,999,999&#39;)&quot;SALARY&quot;
FROM EMP2
WHERE PAY &gt;ANY (SELECT PAY
                FROM EMP2
                WHERE POSITION =&#39;Section head&#39;);</code></pre>
<h3 id="예제-3-1">예제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/3f1d8325-b969-40f7-852d-6d115d0424fc/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME,
       GRADE,
       WEIGHT
FROM STUDENT
WHERE WEIGHT &lt;ALL(SELECT WEIGHT
                FROM STUDENT
                WHERE GRADE = 2);</code></pre>
<h3 id="예제-4-1">예제 4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/dca1347c-184c-4955-8172-84e472fdd41e/image.png" alt=""></p>
<pre><code class="language-sql">SELECT D.DNAME,
       E.NAME,
       TO_CHAR(E.PAY,&#39;$999,999,999&#39;) &quot;SALARY&quot;
FROM EMP2 E,DEPT2 D
WHERE E.DEPTNO = D.DCODE
AND E.PAY &lt;ALL (SELECT AVG(PAY)
                  FROM EMP2 
                  GROUP BY DEPTNO)
ORDER BY 3;</code></pre>
<h3 id="예제-5">예제 5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/b42de9bd-4241-4345-9792-4ad31fc1e010/image.png" alt=""></p>
<p>⭐ 내방법</p>
<pre><code class="language-sql">SELECT GRADE,
       NAME,
       WEIGHT
FROM STUDENT
WHERE WEIGHT IN (SELECT MAX(WEIGHT)
                  FROM STUDENT 
                  GROUP BY GRADE)
ORDER BY 1;</code></pre>
<p>⭐ 강사님 방법</p>
<pre><code class="language-sql">SELECT GRADE,
       NAME,
       WEIGHT
FROM STUDENT
WHERE (GRADE,WEIGHT) IN (SELECT GRADE,
                                MAX(WEIGHT)
                                FROM STUDENT 
                                GROUP BY GRADE)
ORDER BY 1;</code></pre>
<h3 id="예제-6">예제 6</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/96e66bf4-3337-4f4b-bf30-31743335d4a4/image.png" alt=""></p>
<pre><code class="language-sql">SELECT P.PROFNO &quot;PROFNO&quot;,
       P.NAME &quot;PROF_NAME&quot;,
       P.HIREDATE,
       D.DNAME &quot;DEPT_NAME&quot;
FROM PROFESSOR P, DEPARTMENT D
WHERE P.DEPTNO = D.DEPTNO
AND (P.DEPTNO,P.HIREDATE) IN (SELECT DEPTNO,MIN(HIREDATE)
                FROM PROFESSOR
 GROUP BY DEPTNO)
 ORDER BY 3;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.08.29 JSP 사용자 관리 ]]></title>
            <link>https://velog.io/@sofia_777/2022.08.29</link>
            <guid>https://velog.io/@sofia_777/2022.08.29</guid>
            <pubDate>Sun, 04 Sep 2022 13:24:45 GMT</pubDate>
            <description><![CDATA[<h1 id="사용자-관계-1단계---2ppt">사용자 관계 1단계 - 2PPT</h1>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/157b0ffe-ce04-4a97-b7c3-1265848af9b3/image.png" alt=""></p>
<p>memberBean.java</p>
<pre><code class="language-sql">package magic.member;

import java.sql.Timestamp;

public class MemberBean {
    private String mem_uid;
    private String mem_pwd;
    private String mem_name;
    private String mem_email;
    private Timestamp mem_regdate;
    private String mem_addr;

    public String getMem_uid() {
        return mem_uid;
    }
    public void setMem_uid(String mem_uid) {
        this.mem_uid = mem_uid;
    }
    public String getMem_pwd() {
        return mem_pwd;
    }
    public void setMem_pwd(String mem_pwd) {
        this.mem_pwd = mem_pwd;
    }
    public String getMem_name() {
        return mem_name;
    }
    public void setMem_name(String mem_name) {
        this.mem_name = mem_name;
    }
    public String getMem_email() {
        return mem_email;
    }
    public void setMem_email(String mem_email) {
        this.mem_email = mem_email;
    }
    public Timestamp getMem_regdate() {
        return mem_regdate;
    }
    public void setMem_regdate(Timestamp mem_regdate) {
        this.mem_regdate = mem_regdate;
    }
    public String getMem_addr() {
        return mem_addr;
    }
    public void setMem_addr(String mem_addr) {
        this.mem_addr = mem_addr;
    }
}</code></pre>
<h2 id="sql-develope">SQL DEVELOPE</h2>
<p>SQL DEVELOPER에서</p>
<pre><code class="language-sql">CREATE TABLE MEMBERT
(mem_uid VARCHAR2(15) PRIMARY KEY
,mem_pwd VARCHAR2(15) NOT NULL
,mem_name VARCHAR2(10) NOT NULL
,mem_email VARCHAR2(50)
,mem_regdate DATE
,mem_address VARCHAR2(100)
);</code></pre>
<p>입력하여 테이블 생성 </p>
<p>memberDBBean.java</p>
<pre><code class="language-sql">package magic.member;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MemberDBBean {
    Connection conn = null;
    PreparedStatement pstmt = null;

    //1. 전역 MemberDBBean 객체 레퍼런스를 리턴하는 메소드
    private static MemberDBBean instance = new MemberDBBean();
    //참조변수 instance를 객체로 받아서 사용
    public static MemberDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }



    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 member를 memberT 테이블에 삽입하는 메소드
    public int insertMember(MemberBean member) throws Exception{// MemberBean member(매개변수)객체
        int re = -1;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        String sql = &quot;INSERT INTO MEMBERT VALUES (?,?,?,?,?,?)&quot;;


        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음

//            내가 한 방법
//            conn = ((DataSource)(new InitialContext().lookup(&quot;java:comp/env/jdbc/oracle&quot;))).getConnection();
//            pstmt = conn.prepareStatement(sql.toString());//pstmt객체로 받음

            pstmt.setString(1, member.getMem_uid()); 
            //값을 넣기 위해(세팅하기 위해서)사용
            pstmt.setString(2, member.getMem_pwd());
            pstmt.setString(3, member.getMem_name());
            pstmt.setString(4, member.getMem_email());
            pstmt.setTimestamp(5, member.getMem_regdate());
            pstmt.setString(6, member.getMem_addr());
            pstmt.executeUpdate();//쿼리 실행
            //여기서 sql문은 insert문이기 때문에 executeUpdate();를 사용해야함

            re=1;//쿼리가 정상적으로 실행되었을때, re =1 이 됨.

        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
    }



    //4. 회원 가입시 아이디 중복 확인 할때 사용하는 메소드 
    public int confirmID(String id) throws Exception{//String id를 받아서 사용
            int re = -1;
            Connection conn = null;//데이터 베이스 접속
            PreparedStatement pstmt = null;// DB에 SQL 전달
            ResultSet rs = null;//조회시 결과값받음
            String sql =&quot;SELECT * FROM MEMBERT WHERE mem_uid=?&quot;;

            try {
                conn = getConnection();
                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1,id ); //PK인 ID가 존재하는지 확인
                rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음


                //결과를 확인하기 위해서 while 또는 if문 사용
                if (rs.next()) {//id를 pk로 삼아 확인하면 되는거이기 때문에 if문 사용
                    re = 1; //id 조회했을 때 중복인 경우
                }else {
                    re = -1; //id 조회했을 때 중복이 아닌 경우
                    //아이디(계정)을 삭제한 경우
                }
            } catch(SQLException ex) {
                 System.out.println(&quot;조회 실패&quot;);
                 ex.printStackTrace();
              } finally {
                  try{//자원반납(순서 중요)
                      if(pstmt != null)  pstmt.close();
                      if(conn != null)  conn.close();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
              }
            return re;
    }
}</code></pre>
<hr>
<h1 id="사용자-관계-1단계---3ppt">사용자 관계 1단계 - 3PPT</h1>
<h2 id="1-serverxml">1. server.xml</h2>
<p>server.xml 하단에 아래의 코드가 되도록 수정</p>
<pre><code class="language-sql">&lt;Context docBase=&quot;magicWebApp&quot; path=&quot;/magicWebApp&quot; reloadable=&quot;true&quot; source=&quot;org.eclipse.jst.jee.server:magicWebApp&quot;&gt;
      &lt;Resource auth=&quot;Container&quot; driverClassName=&quot;oracle.jdbc.driver.OracleDriver&quot; maxActive=&quot;100&quot; maxIdle=&quot;30&quot; maxWait=&quot;10000&quot; name=&quot;jdbc/oracle&quot; password=&quot;tiger&quot; type=&quot;javax.sql.DataSource&quot; url=&quot;jdbc:oracle:thin:@localhost:1521:xe&quot; username=&quot;scott&quot;/&gt;
      &lt;/Context&gt;&lt;/Host&gt;</code></pre>
<p>registerOk.jsp</p>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.member.MemberDBBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;jsp:useBean id=&quot;mb&quot; class=&quot;magic.member.MemberBean&quot;/&gt;
&lt;jsp:setProperty property=&quot;*&quot; name=&quot;mb&quot;/&gt;

&lt;% 
        MemberDBBean manager=MemberDBBean.getInstance();

        if(manager.confirmID(mb.getMem_uid()) == 1){
%&gt;
        &lt;script&gt;
               alert(&quot;중복되는 아이디가 존재합니다.&quot;);
        &lt;/script&gt;
&lt;%    
        }else{ 
              int re=manager.insertMember(mb); //정상적으로 실행 되면 re=1이 된다.

              if(re == 1){
%&gt;
        &lt;script&gt;
                  alert(&quot;회원가입을 축하드립니다.\n회원으로 로그인 해주세요.&quot;);
        &lt;/script&gt;
&lt;%  
        }else{
%&gt;
        &lt;script&gt;
                  alert(&quot;회원가입에 실패했습니다.&quot;);
        &lt;/script&gt;        
&lt;%          
            }  
        }
%&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>SQL DEVELOPER로 데이터 확인</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/db25b4db-c159-47fb-9867-1cd02313d68a/image.png" alt=""></p>
<p>mem_regdate를 추가(sysdate 변경</p>
<hr>
<p>최종</p>
<h3 id="logoutjsp">logOut.jsp</h3>
<pre><code class="language-sql">&lt;%
    session.invalidate();//세션 제거
    response.sendRedirect(&quot;login.jsp&quot;);
//login.jsp로 이동
 %&gt;</code></pre>
<h3 id="loginokjsp">loginOK.jsp</h3>
<pre><code class="language-sql">&lt;%@page import=&quot;magic.member.MemberDBBean&quot;%&gt;
&lt;%@page import=&quot;magic.member.MemberBean&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%
        String id = request.getParameter(&quot;mem_uid&quot;);
        String pwd = request.getParameter(&quot;mem_pwd&quot;);
        MemberDBBean manager = MemberDBBean.getInstance();
        int check = manager.userCheck(id, pwd);
        MemberBean mb = manager.getMember(id);
        System.out.println(id);
        System.out.println(pwd);
        System.out.println(&quot;d&quot;+check);
        System.out.println(mb);

        if(mb==null){//id가 null이면
    %&gt;
    &lt;script&gt;    
            alert(&quot;존재하지 않는 회원&quot;);
            history.go(-1);//바로 이전페이지로 이동
    &lt;/script&gt;
    &lt;% 
        }
        else{//회원 존재할 시
            String name=mb.getMem_name();


        if(check ==1){//만약에check =1 이면 맞는 거임 main.jsp로 이동시킴
        //세션으로 name과 id를 넘길거임.(메인으로)
            session.setAttribute(&quot;uid&quot;, id);
            session.setAttribute(&quot;name&quot;, name);
            //url을 복사해서 브라우저 붙여넣기하면 튕기게 하여 파라미터추가 하는 방법(예전에 했었음)
            session.setAttribute(&quot;Member&quot;, &quot;yes&quot;);
            //받는 쪽에서 member를 확인 할 수 있음


            //main.jsp로 이동
            response.sendRedirect(&quot;main.jsp&quot;);

        }else if(check==0){ 
    %&gt;            
    &lt;script&gt;    
                alert(&quot;비밀번호가 맞지 않습니다.&quot;);
                history.go(-1);//바로 이전페이지로 이동
    &lt;/script&gt;
    &lt;%            
            } 
            else{
    %&gt;            
    &lt;script&gt;    
                alert(&quot;아이디가 맞지 않습니다.&quot;);
                history.go(-1);//바로 이전페이지로 이동
    &lt;/script&gt;
    &lt;%
            } 
        }

    %&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="mainjsp">main.jsp</h3>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%
    if(session.getAttribute(&quot;Member&quot;)== null){
        response.sendRedirect(&quot;login.jsp&quot;);
    }//loginOk에서 session.setAttribute(&quot;Mebmer&quot;, &quot;yes&quot;);가 아닌경우 login.jsp로 보낸다.(튕기게함)

    String uid = (String)session.getAttribute(&quot;uid&quot;);
    String name = (String)session.getAttribute(&quot;name&quot;);

%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;table border=&quot;1&quot; align=&quot;center&quot;&gt;
    &lt;form method=&quot;post&quot; action =&quot;logOut.jsp&quot;&gt;
    &lt;tr&gt;
        &lt;td&gt;안녕하세요. &lt;%= name %&gt;(&lt;%= uid %&gt;)님 &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;
            &lt;input type=&quot;submit&quot; value=&quot;로그아웃&quot;&gt;
            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
            &lt;input type=&quot;button&quot; value=&quot;회원정보변경&quot;
            onclick=&quot;javascript:window.location=&#39;memberUpdate.jsp&#39;&quot;&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>###login.jsp</p>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table  border=&quot;1&quot;  align=&quot;center&quot;&gt;
        &lt;form method=&quot;post&quot; action=&quot;loginOk.jsp&quot; &gt;
            &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;100&quot;&gt;
                     사용자 ID 
                 &lt;/td&gt;
                 &lt;td  width=&quot;100&quot;&gt;
                     &lt;input type=&quot;text&quot; name=&quot;mem_uid&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td  width=&quot;100&quot;&gt;
                      비밀번호 
                 &lt;/td&gt;
                 &lt;td  width=&quot;100&quot;&gt;
                      &lt;input type=&quot;password&quot; name=&quot;mem_pwd&quot; &gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td  colspan = &quot;2&quot; align=&quot;center&quot;&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;로그인&quot;&gt;
                      &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
                     &lt;input type=&quot;button&quot; value=&quot;회원가입&quot; onclick=&quot;javascirpt:window.location=&#39;register.jsp&#39;&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>memberDBBean.jsp</p>
<pre><code class="language-sql">package magic.member;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MemberDBBean {
    Connection conn = null;
    PreparedStatement pstmt = null;

    //1. 전역 MemberDBBean 객체 레퍼런스를 리턴하는 메소드
    private static MemberDBBean instance = new MemberDBBean();
    //참조변수 instance를 객체로 받아서 사용
    public static MemberDBBean getInstance(){
        return instance;
    //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
    //jsp에서 메소드 호출하면 편하기 때문
    }



    //2.쿼리 작업에 사용할 커넥션 객체를 리턴하는 메소드
    public Connection getConnection( ) throws Exception{
        Context ctx =  new InitialContext();
        DataSource ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        //경로 찾기
        return ds.getConnection();
        //getConnection이나  getInstance는 계속 사용하기 좋음(재사용하기 좋다는 뜻)
        //jsp에서 메소드 호출하면 편하기 때문
    }


    //3. 전달인자로 받은 member를 memberT 테이블에 삽입하는 메소드
    public int insertMember(MemberBean member) throws Exception{// MemberBean member(매개변수)객체
        int re = -1;
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        String sql = &quot;INSERT INTO MEMBERT VALUES (?,?,?,?,sysdate,?)&quot;;


        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);//pstmt객체로 받음

            pstmt.setString(1, member.getMem_uid()); 
            //값을 넣기 위해(세팅하기 위해서)사용
            pstmt.setString(2, member.getMem_pwd());
            pstmt.setString(3, member.getMem_name());
            pstmt.setString(4, member.getMem_email());
//            pstmt.setTimestamp(5, member.getMem_regdate());
            pstmt.setString(5, member.getMem_addr());
            pstmt.executeUpdate();//쿼리 실행
            //여기서 sql문은 insert문이기 때문에 executeUpdate();를 사용해야함

            re=1;//쿼리가 정상적으로 실행되었을때, re =1 이 됨.

        } catch(SQLException ex) {
             System.out.println(&quot;추가 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
    }



    //4. 회원 가입시 아이디 중복 확인 할때 사용하는 메소드 
    public int confirmID(String id) throws Exception{//String id를 받아서 사용
            int re = -1;//결과값 분기처리하기 위해서 변수 선언 
            Connection conn = null;//데이터 베이스 접속//dbcp 연결위한 참조변수 선언
            PreparedStatement pstmt = null;// DB에 SQL 전달//SQL문 사용하기 위한 참조변수 선언
            ResultSet rs = null;//조회시 결과값받음 //쿼리결과값 받기 위해서 참조변수 선언
            String sql =&quot;SELECT * FROM MEMBERT WHERE mem_uid = ?&quot;;//쿼리를 변수로 사용

            try {//DB 처리를 위해서 예외발생을 위한 try~catch문 사용
                conn = getConnection();//dbcp 연결해서 conn 참조변수로 받음
                pstmt = conn.prepareStatement(sql);
                //conn 객체에서 prepareStatment 메소드의 매개변수로 쿼리문 사용
                pstmt.setString(1,id); //쿼리 파라미터를 index로 받아서 처리
                rs = pstmt.executeQuery();//쿼리 결과를 rs에 받음
                //select 조회문은 executeQuery 메소드 처리

                //결과를 확인하기 위해서 while(여러개의 결과값) 또는 if문 사용
                if (rs.next()) {
                    re = 1; //id 조회했을 때 중복인 경우
                }else {
                    re = -1; //id 조회했을 때 중복이 아닌 경우
                }
            } catch(SQLException ex) {//쿼리 조회했다가 오류 발생시 
                 System.out.println(&quot;조회 실패&quot;);
                 ex.printStackTrace();
              } finally {
                  try{//자원반납(순서 중요)
                      if(rs != null) rs.close();
                      if(pstmt != null)  pstmt.close();
                      if(conn != null)  conn.close();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
              }
            return re;
    }


    //5. 사용자 인증시 사용하는 메소드
     public int userCheck(String id, String pwd) throws Exception{
        int re = -1;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String db_mem_pwd;
        String sql=&quot;SELECT MEM_PWD FROM MEMBERT WHERE mem_uid = ?&quot;; 

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,id); 
            rs = pstmt.executeQuery();


            if (rs.next()) {//아이디가 일치하는 로우 존재
                db_mem_pwd = rs.getString(&quot;mem_pwd&quot;);

                if(db_mem_pwd.equals(pwd)) {//패스워드도  일치
                    re = 1;                    
                }else {//패스워드가 불일치
                    re = 0;
                }
            }else {//해당 아이디가 존재하지 않음
                re = -1; 
            }
        } catch(SQLException ex) {
             System.out.println(&quot;조회 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                  if(rs != null) rs.close();
                  if(pstmt != null)  pstmt.close();
                  if(conn != null)  conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return re;
      }

    private String mem_address;

    //6. 아이디가 일치하는 멤버의 정보를 얻어오는 메소드
    public MemberBean getMember(String id) throws Exception{
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

           String sql = &quot;SELECT MEM_UID, MEM_PWD, MEM_NAME, MEM_EMAIL, MEM_REGDATE, MEM_ADDRESS&quot;
                   +&quot;FROM MEMBERT WHERE MEM_UID=?&quot;;

        //*가 아니라 다 적으면 나중에 수정할때 편함
        //재시작하지 않아도 됨.
        MemberBean member=null;

        try{
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();

            //while 또는 if
              if(rs.next()) {//아이디가 일치하는 로우 존재
                member=new MemberBean();
                //가지고 와서 값 setting
                member.setMem_uid(rs.getString(&quot;mem_uid&quot;));
                member.setMem_pwd(rs.getString(&quot;mem_pwd&quot;));
                member.setMem_name(rs.getString(&quot;mem_name&quot;));
                member.setMem_email(rs.getString(&quot;mem_email&quot;));
                member.setMem_regdate(rs.getTimestamp(&quot;mem_regdate&quot;));
                member.setMem_addr(rs.getString(&quot;mem_address&quot;));
              }
        } catch(SQLException ex) {
             System.out.println(&quot;조회 실패&quot;);
             ex.printStackTrace();
          } finally {
              try{//자원반납(순서 중요)
                 rs.close();
                 pstmt.close();
                 conn.close();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
        return member;
      }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.08.26 JSP]]></title>
            <link>https://velog.io/@sofia_777/2022.08.26-JSP</link>
            <guid>https://velog.io/@sofia_777/2022.08.26-JSP</guid>
            <pubDate>Sun, 28 Aug 2022 17:55:57 GMT</pubDate>
            <description><![CDATA[<p>저번 시간에 이어서 </p>
<h1 id="📚connection-pool로-jsp와-데이터-베이스-연동chapter-14-ppt">📚CONNECTION POOL로 JSP와 데이터 베이스 연동(Chapter 14 ppt)</h1>
<h2 id="예제--예제-회원-정보-조회수정">예제- 예제 회원 정보 조회/수정</h2>
<p>updateMember.jsp</p>
<pre><code class="language-sql">&lt;%@page import=&quot;java.sql.Statement&quot;%&gt;
&lt;%@page import=&quot;javax.naming.NamingException&quot;%&gt;
&lt;%@page import=&quot;javax.naming.Context&quot;%&gt;
&lt;%@page import=&quot;javax.naming.InitialContext&quot;%&gt;
&lt;%@page import=&quot;java.sql.SQLException&quot;%&gt;
&lt;%@page import=&quot;java.sql.ResultSet&quot;%&gt;
&lt;%@page import=&quot;java.sql.PreparedStatement&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@page import=&quot;javax.sql.DataSource&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%!
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
        ResultSet rs = null;//결과값
        DataSource ds = null;//DataSource 객체를 통해서 필요한 Connection을 획득, 반납 등의 작업
    %&gt;

    &lt;%
        try{
            Context ctx =  new InitialContext();
            ds = (DataSource)ctx.lookup(&quot;java:comp/env/jdbc/oracle&quot;);//캐스팅
            conn = ds.getConnection();
            System.out.println(&quot;DBCP 연동 성공&quot;);//DBCP 연동을 위한 설정 

            StringBuffer selectQuery = new StringBuffer(); //쿼리
            selectQuery.append(&quot;SELECT name, class, tel FROM MEMBER2 WHERE ID = ?&quot;);
            //? 가 있는 이유 : 아이디 값을 받기 위해(파라미터를 받기 위해)
            String id = request.getParameter(&quot;id&quot;);//viewMember에서 준 데이터 받기)
            pstmt = conn.prepareStatement(selectQuery.toString());
            pstmt.setString(1, id);//sql문을 받고 ?에 매개변수 userID 삽입  //결과는 id 하나만 가지고 온다.(뭔소리이지?)
            rs = pstmt.executeQuery();//쿼리 실행

            if(rs.next()){ //원래 반복문인데 이 예제는 id를 pk로 삼아 확인하면 되는거이기 때문
        %&gt;
                &lt;form method=&quot;post&quot; action=&quot;updateProcess.jsp&quot;&gt;
                    아이디 : &lt;input readonly type=&quot;text&quot; name = &quot;id&quot; value=&quot;&lt;%= id %&gt;&quot;&gt;&lt;br&gt;
                    &lt;!-- &#39;readonly&#39; 오로지 읽기만 가능(수정 안됨) --&gt;
                    이름 : &lt;input  type=&quot;text&quot; name = &quot;name&quot; value=&quot;&lt;%= rs.getString(&quot;name&quot;) %&gt;&quot;&gt;&lt;br&gt;
                    &lt;!-- rs.getString(&quot;name&quot;)을 쓰는 이유 : name의 값을 받아야하기 때문 --&gt;
                    회원등급 : &lt;input  type=&quot;text&quot; name = &quot;mclass&quot; value=&quot;&lt;%= rs.getString(&quot;class&quot;) %&gt;&quot;&gt;&lt;br&gt;
                    전화번호 : &lt;input  type=&quot;text&quot; name = &quot;tel&quot; value=&quot;&lt;%= rs.getString(&quot;tel&quot;) %&gt;&quot;&gt;&lt;br&gt;
                    &lt;input type=&quot;submit&quot; value=&quot;수정&quot;&gt;
                    &lt;a href=&quot;viewMember.jsp&quot;&gt;목록보기&lt;/a&gt;
                &lt;/form&gt;
        &lt;%
                }else{ //데이터 삭제하였을때 발생 
        %&gt;            
                    &lt;font color =&quot;red&quot;&gt; 아이디 없3~~~&lt;/font&gt;        
                    &lt;a href=&quot;viewMember.jsp&quot;&gt;목록보기&lt;/a&gt;
        &lt;%
                }



        }catch(NamingException ne){
            ne.printStackTrace();
        }catch(SQLException ex) {
             out.print(&quot;데이터베이스 연결이 실패했습니다.&lt;br&gt;&quot;);
             out.print(&quot;SQLException : &quot;+ex.getMessage());
          } finally {
              try{

              }catch(Exception e){
                  e.printStackTrace();
              }
             if(conn != null) {
                conn.close();
             }
          }
    %&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>viewMember.jsp(먼저 실행)</p>
<pre><code class="language-sql">&lt;%@page import=&quot;java.sql.DriverManager&quot;%&gt;
&lt;%@page import=&quot;java.sql.SQLException&quot;%&gt;
&lt;%@page import=&quot;java.sql.ResultSet&quot;%&gt;
&lt;%@page import=&quot;java.sql.Statement&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;%!
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    String url = &quot;jdbc:oracle:thin:@localhost:1521:xe&quot;;
    String user = &quot;scott&quot;;
    String password = &quot;tiger&quot;;
    String selectQuery = &quot;SELECT * FROM MEMBER2&quot;;
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table width=&quot;400&quot; border=&quot;1&quot;&gt;
        &lt;tr&gt;
            &lt;td&gt;아이디&lt;/td&gt;
            &lt;td&gt;이름&lt;/td&gt;
            &lt;td&gt;등급&lt;/td&gt;
            &lt;td&gt;전화번호&lt;/td&gt;
        &lt;/tr&gt;
        &lt;%
            try {
                Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
                conn = DriverManager.getConnection(url, user, password);
                stmt = conn.createStatement();
                rs = stmt.executeQuery(selectQuery); //쿼리 결과를 rs로 받음

                while(rs.next()) {
        %&gt;
        &lt;tr&gt;
            &lt;%-- &lt;td&gt;&lt;%= rs.getString(&quot;id&quot;) %&gt;&lt;/td&gt; --%&gt;
            &lt;td&gt;
                &lt;a href = &quot;updateMember.jsp?id=&lt;%= rs.getString(&quot;id&quot;) %&gt;&quot;&gt;&lt;%-- 실제 이동하는 거--%&gt;
                     &lt;%= rs.getString(&quot;id&quot;) %&gt;&lt;%-- 화면에 보여주는거 --%&gt;
                &lt;/a&gt;
            &lt;/td&gt;
            &lt;td&gt;
                &lt;%= rs.getString(&quot;name&quot;) %&gt;
            &lt;/td&gt;
            &lt;%-- &lt;td&gt;&lt;%= rs.getInt(&quot;class&quot;) %&gt;&lt;/td&gt; 주석 : Ctrl+Shift+/ --%&gt;
            &lt;td&gt;
                &lt;%
                    int n_class = rs.getInt(&quot;class&quot;);

                    if(n_class == 1) {
                        out.print(&quot;일반회원&quot;);
                    } else {
                        out.print(&quot;교수님&quot;);
                    }
                %&gt;
            &lt;/td&gt;
            &lt;td&gt;&lt;%= rs.getString(&quot;tel&quot;) %&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;%
                }
            } catch(SQLException ex) {
                ex.getMessage();
            } finally {
                try {
                    if(rs != null) rs.close();
                    if(stmt != null) stmt.close();
                    if(conn != null) conn.close();
                } catch(SQLException ex) {
                    ex.getMessage();
                }
            }
        %&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>updateProcess.jsp 생성</p>
<pre><code class="language-sql">&lt;%@page import=&quot;javax.naming.InitialContext&quot;%&gt;
&lt;%@page import=&quot;java.sql.PreparedStatement&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@page import=&quot;javax.sql.DataSource&quot;%&gt;
&lt;%@page import=&quot;javax.naming.NamingException&quot;%&gt;
&lt;%@page import=&quot;javax.naming.Context&quot;%&gt;
&lt;%@page import=&quot;java.sql.SQLException&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%!
        Connection conn = null;//데이터 베이스 접속
        PreparedStatement pstmt = null;// DB에 SQL 전달
    %&gt;

    &lt;%
      try { 
            conn = ((DataSource)(new InitialContext().lookup(&quot;java:comp/env/jdbc/oracle&quot;))).getConnection();//캐스팅 필요
      } catch(NamingException ne) { //JDBC? 이름 못찾을 때
             ne.printStackTrace();
      } catch(SQLException ex) { //데이터베이스 문제 있을 때
             ex.getMessage();
      }

      String id = &quot;&quot;, name=&quot;&quot;, vclass=&quot;&quot;, tel=&quot;&quot;;
      id = request.getParameter(&quot;id&quot;);
      name = request.getParameter(&quot;name&quot;);
      vclass = request.getParameter(&quot;mclass&quot;);
      tel = request.getParameter(&quot;tel&quot;);

      StringBuffer updateQuery = new StringBuffer(); //쿼리
      updateQuery.append(&quot;UPDATE MEMBER2 SET NAME = ?, CLASS = ?, TEL = ? WHERE ID =?&quot;);
      //?에 전달된 값을 받는다.(name,id,vclass등...)

      try{//update에 관련된거
         pstmt = conn.prepareStatement(updateQuery.toString());
         pstmt.setString(1, name);  //값을 넣기 위해(세팅하기 위해서)사용//id는 수정불가능하니깐!!!+걍 쿼리에서 ?된거만 넣음
         pstmt.setInt(2, Integer.parseInt(vclass));//캐스팅 형변환(vclass는 숫자임)
         pstmt.setString(3, tel);
         pstmt.setString(4, id);
         int re = pstmt.executeUpdate();//데이터베이스에서 데이터를 추가, 삭제, 수정하는 SQL 문을 실행

         if(re ==1){
     %&gt;
             &lt;%= id %&gt;의 정보가 수정되었습니다.
             [&lt;a href=&quot;viewMember.jsp&quot;&gt;목록보기&lt;/a&gt;]
     &lt;%
         }else{//이미 기존의 데이터가 삭제되었을때
     %&gt;       
             변경실패
     &lt;%        
         }
      }catch(SQLException ex) { //데이터베이스 문제 있을 때
         out.print(&quot;데이터베이스 연결이 실패했습니다.&lt;br&gt;&quot;);
         out.print(&quot;SQLException : &quot;+ex.getMessage());
      } finally { //Connection 관련 close
         try {
            if(conn != null) {
               conn.close();
            }
         } catch(Exception e) {
            e.printStackTrace();
         }
      }
   %&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>데이터 변경 쿼리를 예로 들면 </p>
<pre><code class="language-sql">UPDATE MEMBER2
    SET NAME =&#39;임영웅&#39;
     , CLASS = 2
     , TEL =&#39;010-9999-8888&#39;
WHERE ID =&#39;bbb&#39;;</code></pre>
<p>이런 쿼리를 사용한다고 할때, 실제 jsp 테이블에서는 
<code>&quot;UPDATE MEMBER2 SET NAME = ?, CLASS = ?, TEL = ? WHERE ID =?&quot;</code> 으로 바꿔주어야함</p>
<h1 id="📚사용자-관리chapter-15-ppt">📚사용자 관리(Chapter 15 ppt)</h1>
<h2 id="1단계">1단계</h2>
<p>📌우리가 최종적으로 만들어야하는 프로젝트의 모습
Dynamic Wep Project 생성 후,
member 폴터에 login.jsp, register.jsp, script.jsp 생성</p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/f5881828-ec29-420a-9b12-8d34d6d51ea6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/7ca2ca68-1071-4b66-8db7-190c188cd0d0/image.png" alt=""></p>
<h4 id="📍loginjsp">📍login.jsp</h4>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table  border=&quot;1&quot; &gt;
        &lt;form  method=&quot;post&quot; action=&quot;LoginOk.jsp&quot; &gt;
            &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;100&quot;&gt;
                     사용자 ID 
                 &lt;/td&gt;
                 &lt;td  width=&quot;100&quot;&gt;
                     &lt;input type=&quot;text&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td  width=&quot;100&quot;&gt;
                      비밀번호 
                 &lt;/td&gt;
                 &lt;td  width=&quot;100&quot;&gt;
                      &lt;input type=&quot;password&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td  colspan = &quot;2&quot; align=&quot;center&quot;&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;로그인&quot;&gt;
                      &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
                     &lt;input type=&quot;button&quot; value=&quot;회원가입&quot; onclick=&quot;javascirpt:window.location=&#39;register.jsp&#39;&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="📍registerjsp">📍register.jsp</h4>
<pre><code class="language-sql">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=EUC-KR&quot;
    pageEncoding=&quot;EUC-KR&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;script language=&quot;JavaScript&quot; src=&quot;script.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;meta charset=&quot;EUC-KR&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table  border=&quot;1&quot; align =&quot;center&quot;&gt;
        &lt;form name=&quot;reg_frm&quot; method=&quot;post&quot; action=&quot;registerOk.jsp&quot;&gt;
            &lt;tr height=&quot;50&quot;&gt;
                 &lt;td colspan = &quot;2&quot;&gt;
                     &lt;h1&gt;회원 가입 신청&lt;/h1&gt;
                     &#39;*&#39;표시 항목은 필수 입력 항목입니다.
                 &lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;User ID&lt;/td &gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;20&quot; name=&quot;mem_uid&quot; &gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;암호&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;password&quot; size =&quot;20&quot; name=&quot;mem_pwd&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;암호 확인&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;password&quot; size =&quot;20&quot; name=&quot;pwd_check&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;이     름&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;20&quot; name= &quot;name&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;E-mail&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;30&quot;name=&quot;email&quot;&gt;*&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr height=&quot;30&quot;&gt;
                 &lt;td width=&quot;80&quot;&gt;주     소&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;text&quot; size =&quot;40&quot;name=&quot;address&quot;&gt;&lt;/td&gt;
             &lt;/tr&gt;
             &lt;tr&gt;
                 &lt;td colspan = &quot;2&quot; align=&quot;center&quot;&gt;
                      &lt;input type=&quot;button&quot; value=&quot;등록&quot; onclick=&quot;check_ok()&quot;&gt;
                     &lt;input type=&quot;reset&quot; value=&quot;다시입력&quot;&gt;
                     &lt;input type=&quot;button&quot; value=&quot;가입안함&quot; onclick=&quot;javascript:window.location=&#39;login.jsp&#39;&quot;&gt;
                 &lt;/td&gt;
             &lt;/tr&gt;
        &lt;/form&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="📍scriptjsp">📍script.jsp</h4>
<pre><code class="language-sql">function check_ok(){
    //if(document.reg_frm.mem_uid.value==&quot;&quot;){
    //if(reg_frm.mem_uid.value==&quot;&quot;){
    if(reg_frm.mem_uid.value.length==0){
        alert(&quot;아이디를 써주세요&quot;);
        reg_frm.mem_uid.focus();
        return;//아이디가 없으면 리턴
    }

    if(reg_frm.mem_uid.value.length &lt; 4){
        alert(&quot;아이디는 4글자이상이어야 합니다.&quot;);
        reg_frm.mem_uid.focus();
        return;//아이디가 없으면 리턴
    }

    if(reg_frm.mem_pwd.value.length == 0){
        alert(&quot;패스워드는 반드시 입력해야 합니다.&quot;);
        reg_frm.mem_pwd.focus();
        return;//패스워드가 없으면 리턴
    }

    if( reg_frm.pwd_check.value != reg_frm.mem_pwd.value){
        alert(&quot;패스워드가 일치하지 않습니다.&quot;);
        reg_frm.pwd_check.focus();
        return;//패스워드가 일치하지 않으면 리턴
    }
    document.reg_frm.submit(); //입력값이 조건에 다 맞으면 action=&quot;registerOk.jsp&quot;으로 가겠다.(전송/submit)
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2022.08.25 SQL]]></title>
            <link>https://velog.io/@sofia_777/2022.08.25</link>
            <guid>https://velog.io/@sofia_777/2022.08.25</guid>
            <pubDate>Sun, 28 Aug 2022 17:47:56 GMT</pubDate>
            <description><![CDATA[<p>원래는 js나 jQurey를 해야하는데 일차적으로 진도를 나감 + 평가시험 실시로 인해서 jsp와 오라클 진행</p>
<h1 id="📚oracle-복습-문제">📚Oracle 복습 문제</h1>
<h3 id="📘문제-1">📘문제 1</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/801779ff-e266-43c3-99a3-6e3290b04edd/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME,
       EMAIL,
       SUBSTR(EMAIL,INSTR(EMAIL,&#39;@&#39;)+1) &quot;DOMAIN&quot;,
       PAY,
       RANK()OVER(PARTITION BY SUBSTR(EMAIL,INSTR(EMAIL,&#39;@&#39;)+1)
                  ORDER BY PAY DESC)&quot;RANK&quot;
FROM PROFESSOR
WHERE EMAIL IS NOT NULL;</code></pre>
<h3 id="📘문제-2">📘문제 2</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/bf9be7a3-5319-4aa5-b58e-c91cc40eb4fe/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME,
       HPAGE,
       SUBSTR(EMAIL,INSTR(EMAIL,&#39;@&#39;)+1) &quot;DOMAIN&quot;,
       PAY,
       SUM(PAY)OVER(PARTITION BY SUBSTR(EMAIL,INSTR(EMAIL,&#39;@&#39;)+1) 
                    ORDER BY NAME )&quot;TOTAL&quot;
FROM PROFESSOR
WHERE HPAGE IS NOT NULL;</code></pre>
<p>강사님 방법</p>
<pre><code class="language-sql">SELECT NAME,
       HPAGE,
       SUBSTR(HPAGE,INSTR(HPAGE,&#39;.&#39;)+1) &quot;DOMAIN&quot;,
       PAY,
       SUM(PAY)OVER(PARTITION BY SUBSTR(EMAIL,INSTR(EMAIL,&#39;@&#39;)+1) 
                    ORDER BY NAME )&quot;TOTAL&quot;
FROM PROFESSOR
WHERE HPAGE IS NOT NULL;</code></pre>
<h3 id="📘문제-3">📘문제 3</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8358f1d9-f460-4654-b7eb-5b86d2ec8f82/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME,
       TEL,
       WEIGHT,
       SUM(WEIGHT)OVER(PARTITION BY  SUBSTR(TEL,1,INSTR(TEL,&#39;)&#39;)-1)
                       ORDER BY WEIGHT DESC )&quot;TOTAL&quot;,
       ROUND(WEIGHT/SUM(WEIGHT)
                    OVER(PARTITION BY SUBSTR(TEL,1,
                                      INSTR(TEL,&#39;)&#39;)-1))*100,2)&quot;RATIO(%)&quot;
FROM STUDENT
GROUP BY NAME,TEL,WEIGHT;</code></pre>
<p>강사님 방법</p>
<pre><code class="language-sql">SELECT NAME,
       TEL,
       WEIGHT,
       SUM(WEIGHT)OVER(PARTITION BY  SUBSTR(TEL,1,INSTR(TEL,&#39;)&#39;)-1)
                       ORDER BY WEIGHT DESC )&quot;TOTAL&quot;,
       ROUND(RATIO_TO_REPORT(SUM(WEIGHT))
                    OVER(PARTITION BY SUBSTR(TEL,1,
                                      INSTR(TEL,&#39;)&#39;)-1))*100,2)&quot;RATIO(%)&quot;
FROM STUDENT
GROUP BY NAME,TEL,WEIGHT;</code></pre>
<h3 id="📘문제-4">📘문제 4</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/bd80c3bd-670b-4f94-9204-7ffdafc2c2b5/image.png" alt=""></p>
<pre><code class="language-sql">SELECT NAME,
       BIRTHDAY,
       TRUNC((SYSDATE-BIRTHDAY)/365,0) &quot;AGE&quot;,
       A.POSITION &quot;CURR_POSITION&quot;,
       B.POSITION
FROM EMP2 A, P_GRADE B 
WHERE TRUNC((SYSDATE-BIRTHDAY)/365,0) BETWEEN S_AGE AND E_AGE
ORDER BY BIRTHDAY DESC;</code></pre>
<h3 id="📘문제-5">📘문제 5</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8c49172c-bee7-46c6-b245-0e0c0d1f1b0a/image.png" alt=""></p>
<p>내 방법</p>
<pre><code class="language-sql">SELECT C.GNAME &quot;CUST_NAME&quot; ,
       C.POINT &quot;POINT&quot; ,
       G.GNAME &quot;GIFT_NAME&quot;
FROM CUSTOMER C, GIFT G 
WHERE POINT &gt;= 600001
AND G.GNAME = &#39;Notebook&#39;;</code></pre>
<p>강사님 방법</p>
<pre><code class="language-sql">SELECT C.GNAME &quot;CUST_NAME&quot; ,
       C.POINT &quot;POINT&quot; ,
       G.GNAME &quot;GIFT_NAME&quot;
FROM CUSTOMER C, GIFT G 
WHERE G.G_START&lt;C.POINT
AND G.GNAME = &#39;Notebook&#39;;</code></pre>
<h3 id="📘문제-6">📘문제 6</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/ad10f9c4-a99f-4679-9bcd-076677040af5/image.png" alt=""></p>
<pre><code class="language-sql">SELECT P1.PROFNO ,
       P1.NAME ,
       TO_CHAR(P1.HIREDATE,&#39;YYYY/MM/DD&#39;) &quot;HIREDATE&quot;,
       COUNT(P2.HIREDATE) &quot;COUNT&quot;
FROM PROFESSOR P1,PROFESSOR P2
WHERE P2.HIREDATE (+)&lt; P1.HIREDATE
GROUP BY P1.PROFNO,P1.NAME,P1.HIREDATE
ORDER BY 4;</code></pre>
<h3 id="📘문제-7">📘문제 7</h3>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/8923a3b9-c517-46dc-8e2d-97541ec4470f/image.png" alt=""></p>
<pre><code class="language-sql">SELECT E1.EMPNO ,
       E1.ENAME ,
       TO_CHAR(E1.HIREDATE,&#39;YY/MM/DD&#39;) &quot;HIREDATE&quot;,
       COUNT(E2.HIREDATE) &quot;COUNT&quot;
FROM EMP E1,EMP E2
WHERE E1.HIREDATE &gt; E2.HIREDATE(+)
GROUP BY E1.EMPNO ,E1.ENAME ,E1.HIREDATE
ORDER BY 4;</code></pre>
<h1 id="📚viewchapter-9-ppt">📚VIEW(Chapter 9 ppt)</h1>
<h2 id="view">view</h2>
<p>: 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블.(저장장치내엔 물리적으로 존재x)</p>
<h2 id="view생성">view생성</h2>
<p>중요한게 처음엔 권한이 없어서 view 생성이 되지 않음. 그래서 권한을 주기 위해서
cmd창에 sqlplus / as sysdba;으로 연결후 <code>grant create view(이름) to user명;</code>하여 권한 부여 </p>
<pre><code class="language-sql">CREATE VIEW V_EMP1
AS 
SELECT EMPNO, ENAME, HIREDATE, DEPTNO
  FROM EMP;</code></pre>
<p><img src="https://velog.velcdn.com/images/sofia_777/post/23f064d5-8442-46af-af2a-d2025845091f/image.png" alt=""></p>
<h1 id="view수정">view수정</h1>
<p>수정할때마다 VIEW를 삭제하고 다시 만들어야 하는가?
DEPTNO를 없앤다고 한다면</p>
<pre><code class="language-sql">CREATE OR REPLACE VIEW V_EMP1
AS 
SELECT EMPNO, ENAME, HIREDATE
  FROM EMP;</code></pre>
<p>실행 
<img src="https://velog.velcdn.com/images/sofia_777/post/3ec67b13-5aaf-4ae6-8c6f-86237d7dfa0b/image.png" alt="">
그럼 DEPTNO가 사라짐을 확인 할 수 있음
이때, 만약에 권한을 뺏고싶으면
<code>REVOKE CREATE VIEW FROM  user명;</code>
을 사용함</p>
<p>(<code>REVOKE CREATE VIEW FROM  user명;</code> 사용시
<img src="https://velog.velcdn.com/images/sofia_777/post/a77f6252-a4dd-4535-a6d0-3432941eba6a/image.png" alt="">
오류 발생함) </p>
<h1 id="📚references">📚References</h1>
<blockquote>
<ul>
<li><a href="https://hoon93.tistory.com/32">https://hoon93.tistory.com/32</a></li>
</ul>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>