<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Untitled_Blue</title>
    <link>https://untitedblue.tistory.com/</link>
    <description>개발자를 꿈꾸는 남자의 공간</description>
    <language>ko</language>
    <pubDate>Wed, 8 Apr 2026 20:41:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Untitled_Blue</managingEditor>
    <item>
      <title>[Spring] DI에 대한 이해</title>
      <link>https://untitedblue.tistory.com/entry/Spring-DI%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 DI (의존성 주입)에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- 의존성 주입 (DI, Dependency Injection) 이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부에서 객체를 직접 주입하는 방식&lt;/li&gt;
&lt;li&gt;객체 간의 느슨한 결합을 제공하며 이를 통해 유지보수가 용이하도록 지원&lt;/li&gt;
&lt;li&gt;코드의 재사용률을 증가시키며 객체를 개발자가 아닌 프레임워크에서 생성하도록 지원&lt;/li&gt;
&lt;li&gt;의존성 주입하는 방법은 생성자 주입, 필드 주입, 빈 관리, setter 주입이 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 의존성 주입은 왜 필요한가?&lt;/h3&gt;
&lt;pre id=&quot;code_1727526937341&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class VGA {
    public void mStart() {
        System.out.println(&quot;VGA Start&quot;);
    }
}

//*******************************************************

public class IntelARC extends VGA {
    @Override
    public void mStart() {
        System.out.println(&quot;VGA IntelARC Boot !&quot;);
    }
}

//*******************************************************

public class Nvidia extends VGA {
    @Override
    public void mStart() {
        System.out.println(&quot;VGA Nvidia Boot !&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1727527030944&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SecondComputer {
    private VGA vga;

    public SecondComputer() {
        this.vga = new Nvidia(); // 객체를 직접 주입 =&amp;gt; 강한 결합
    }

    public void boot() {
        System.out.println(&quot;Computer2 Boot !&quot;);
        vga.mStart();
    }
}

// *******************************************************************

public class ThirdComputer {
    private VGA vga = new IntelARC();

    public void boot() {
        System.out.println(&quot;Computer3 Boot !&quot;);
        vga.mStart();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1727527059320&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        // DI 미사용 =&amp;gt; 여러 개 이상이면 유지보수 시간 및 비용 증가
        SecondComputer computer2 = new SecondComputer();
        computer2.boot();

        ThirdComputer computer3 = new ThirdComputer();
        computer3.boot();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 프로그래밍 기준으로 컴퓨터 안에 그래픽카드를 설치해야 하는 상황에서 그래픽카드는 엔디비아와 인텔아크 사의 제품이 있다고 가정해보자. 이때 컴퓨터는 두 개가 있는데 각각의 컴퓨터에 직접적으로 각각의 다른 그래픽카드를 설치(주입)했다. 이렇게 되면 컴퓨터라는 객체는 그래픽카드라는 객체에 의존 중인 것이다. 이렇게 되면 추후 그래픽카드를 변경할 때 각각의 컴퓨터에 가서 그래픽카드라는 객체를 변경해줘야 한다. 이렇게 되면 시간과 비용 소요가 크기 때문에 유지보수 면에서도 용이하지 않다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btwcrT/btsJPDN06qI/3eaCLjbF7LK7n1phFwVLjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btwcrT/btsJPDN06qI/3eaCLjbF7LK7n1phFwVLjK/img.png&quot; data-alt=&quot;DI를 통한 결합도 저하시킨 코드 [코드가 많은 관계로 확장해서 보는 것을 권장한다.]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btwcrT/btsJPDN06qI/3eaCLjbF7LK7n1phFwVLjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtwcrT%2FbtsJPDN06qI%2F3eaCLjbF7LK7n1phFwVLjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1571&quot; height=&quot;423&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DI를 통한 결합도 저하시킨 코드 [코드가 많은 관계로 확장해서 보는 것을 권장한다.]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1727529137048&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        VGA vga = null;
        
        vga = new IntelARC();
        FirstComputer computer1 = new FirstComputer(vga);
        computer1.boot();

        vga = new Nvidia();
        SecondComputer computer2 = new SecondComputer(vga);
        computer2.boot();

        vga = new Radeon();
        ThirdComputer computer3 = new ThirdComputer(vga);
        computer3.boot();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단과 같이 각각의 컴퓨터에 그래픽카드라는 객체 간의 결합도를 저하시켰다. 이렇게 되면 각각의 객체에 대한 의존성 주입이 가능하게 되면서 한 곳에서 객체 간의 관계를 상대적으로 쉽게 설정할 수 있으며 유지보수에 용이하게 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 의존성 주입 방법 1 : 생성자 주입&lt;/h3&gt;
&lt;pre id=&quot;code_1727532226509&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class HomeController {
	private final TestService testService;
	
	@Autowired
	public HomeController(TestService testService) {
		this.testService = testService;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성자를 통한 의존성 주입받는 방식이며 스프링에서도 공식적으로 해당 방법 권장하고 있음&lt;/li&gt;
&lt;li&gt;객체의 불변성을 통한 NullPointerException 발생 방지 가능 (생성자는 1회에 한해 호출 가능하기 때문)&lt;/li&gt;
&lt;li&gt;Spring 4.3 부터는 @Autowired 어노테이션 생략 가능&lt;/li&gt;
&lt;li&gt;순환 참조 에러 방지 가능 (StackOverFlow : 서로가 서로를 메서드를 통해 참조 내지 바라보는 방식으로 인한 에러)&lt;/li&gt;
&lt;li&gt;SOLID 내 단일 책임 원칙 보장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 의존성 주입 방법 2 : 필드 주입&lt;/h3&gt;
&lt;pre id=&quot;code_1727598283571&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class HomeController {
	@Autowired
	private TestService testService;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별도의 생성자 없이 직관적으로 필드만으로 의존성 주입하는 방식&lt;/li&gt;
&lt;li&gt;생성자 주입에 비하면 상대적으로 간결한 점이 특징&lt;/li&gt;
&lt;li&gt;final 키워드 사용 불가하며 의존 관계 파악이 어렵고 불변성이 보장되지 않는만큼 객체 변화가 쉬움&lt;/li&gt;
&lt;li&gt;SOLID 내 단일 책임 원칙에 위배됨&lt;/li&gt;
&lt;li&gt;NullPointerException, StackOverFlow 에러 발생 가능성 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 의존성 주입 방법 3 : 수정자 주입&lt;/h3&gt;
&lt;pre id=&quot;code_1727598570158&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class HomeController {
	private TestService testService;
	
	@Autowired
	public void setTestService(TestService testService) {
		this.testService = testService;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;setter를 통한 의존성 주입하는 방식&lt;/li&gt;
&lt;li&gt;final 키워드를 사용할 수 없는 만큼 불변성이 보장되지 않음&lt;/li&gt;
&lt;li&gt;NullPointerException 에러 발생 가능성 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 의존성 주입 방법 4 : 빈 관리&lt;/h3&gt;
&lt;pre id=&quot;code_1727784458953&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;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;
	xmlns:mvc=&quot;http://www.springframework.org/schema/mvc&quot;
	xmlns:util=&quot;http://www.springframework.org/schema/util&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
		http://www.springframework.org/schema/beans https://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
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd&quot;&amp;gt;
	
	&amp;lt;bean id=&quot;testServiceimpl&quot; class=&quot;com.spf.study.TestServiceimpl&quot;&amp;gt;&amp;lt;/bean&amp;gt;
	&amp;lt;bean id=&quot;testDAO&quot; class=&quot;com.spf.study.TestDAO&quot;&amp;gt;&amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈을 통한 의존성 주입하는 방법 중 하나는 XML 파일을 통한 방법이다. XML 파일은 root-context.xml 파일이며 내부에 &amp;lt;bean&amp;gt; 태그를 통해 속성으로 id와 class를 추가해서 자바에 대한 객체를 생성해서 스프링 컨테이너에서 관리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring Framework</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/76</guid>
      <comments>https://untitedblue.tistory.com/entry/Spring-DI%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4#entry76comment</comments>
      <pubDate>Tue, 1 Oct 2024 22:03:44 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 스프링 설정 파일 사용 방법</title>
      <link>https://untitedblue.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 스프링에 대한 설명에서 이어지는 설정 파일 사용하는 방법에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- 설정 파일 종류&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;web.xml : 배치 지시자(DD, Deployment Descriptor)로서 웹 애플리케이션의 기본적인 설정 정보를 담고 있는 파일&lt;/li&gt;
&lt;li&gt;root-context.xml : Service, DAO, DB 등과 같은 비즈니스 로직을 담당하는 파일이며 여기에 등록된 빈즈는 모든 컨텍스트에 사용가능&lt;/li&gt;
&lt;li&gt;servlet-context.xml : 요청과 관련된 객체를 정의하는 파일이며 View와 관련된 Annotation, Controller 등 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726228377725&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;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;&amp;gt;

	&amp;lt;!-- The definition of the Root Spring Container shared by all Servlets and Filters --&amp;gt;
	&amp;lt;context-param&amp;gt;
		&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
		&amp;lt;param-value&amp;gt;/WEB-INF/spring/root-context.xml&amp;lt;/param-value&amp;gt;
	&amp;lt;/context-param&amp;gt;
	
	&amp;lt;!-- Creates the Spring Container shared by all Servlets and Filters --&amp;gt;
	&amp;lt;listener&amp;gt;
		&amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;
	&amp;lt;/listener&amp;gt;

	&amp;lt;!-- Processes application requests --&amp;gt;
	&amp;lt;servlet&amp;gt;
		&amp;lt;servlet-name&amp;gt;appServlet&amp;lt;/servlet-name&amp;gt;
		&amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;/WEB-INF/spring/appServlet/servlet-context.xml&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
		&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
	&amp;lt;/servlet&amp;gt;
		
	&amp;lt;servlet-mapping&amp;gt;
		&amp;lt;servlet-name&amp;gt;appServlet&amp;lt;/servlet-name&amp;gt;
		&amp;lt;url-pattern&amp;gt;/&amp;lt;/url-pattern&amp;gt;
	&amp;lt;/servlet-mapping&amp;gt;
    
    &amp;lt;filter&amp;gt;
		&amp;lt;filter-name&amp;gt;encoding&amp;lt;/filter-name&amp;gt;
		&amp;lt;servlet-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/servlet-class&amp;gt;
		&amp;lt;init-param&amp;gt;
			&amp;lt;param-name&amp;gt;appServlet&amp;lt;/param-name&amp;gt;
			&amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
		&amp;lt;/init-param&amp;gt;
	&amp;lt;/filter&amp;gt;
	
	&amp;lt;filter-mapping&amp;gt;
		&amp;lt;filter-name&amp;gt;encoding&amp;lt;/filter-name&amp;gt;
		&amp;lt;url-pattern&amp;gt;/&amp;lt;/url-pattern&amp;gt;
	&amp;lt;/filter-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 안에 있는 각 태그별 특징과 역할을 분석하고자 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;context-param : root-context를 설정해주며 내부에 &lt;b&gt;contextConfigLocation&lt;/b&gt;이라는 스프링 동작을 위한 설정파일 위치를 알려주는 파라미터가 적혀있음 (파라미터를 통해 root-context.xml 파일의 위치를 확인할 수 있음.)&lt;/li&gt;
&lt;li&gt;listener : &lt;b&gt;ContextLoaderListener&lt;/b&gt; 클래스를 통해서 &lt;b&gt;contextConfigLocation에서 확인한 root-context의 파일 위치를 기반으로 &lt;/b&gt;스프링 설정파일을 읽고 필요한 객체들을 생성 및 등록하는 역할&lt;/li&gt;
&lt;li&gt;servlet : 웹 애플리케이션의 요청을 처리하는 곳이며 DispatcherServlet클래스가 요청과 응답을 모두 담당&lt;/li&gt;
&lt;li&gt;servlet-mapping : url-pattern에 설정된 값 요청이 들어오면 servlet-name에 있는 서블릿명을 통해 서블릿 호출&amp;nbsp;&lt;/li&gt;
&lt;li&gt;filter : 웹 애플리케이션에서 특정 요청이 있을 때 먼저 실행되는 부분&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726302563215&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;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;&amp;gt;

	&amp;lt;!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --&amp;gt;
	
	&amp;lt;!-- Enables the Spring MVC @Controller programming model --&amp;gt;
	&amp;lt;annotation-driven /&amp;gt;

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

	&amp;lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&amp;gt;
	&amp;lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;
		&amp;lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&amp;gt;
		&amp;lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&amp;gt;
	&amp;lt;/beans:bean&amp;gt;
	
	&amp;lt;context:component-scan base-package=&quot;com.spring.study&quot; /&amp;gt;
&amp;lt;/beans:beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 XML는 servlet-context.xml이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;annotation-driven : 스프링에서 어노테이션을 사용하도록 도와주는 역할&lt;/li&gt;
&lt;li&gt;resources : 정적인 자원들의 정보를 기술하고 있으며 해당 자원의 위치 정보가 들어가있다.&lt;/li&gt;
&lt;li&gt;context:component-scan : package 내 파일에 있는 어노테이션을 읽어들여서 beans로 등록하는 역할&lt;/li&gt;
&lt;li&gt;beans:bean : ViewResolver 클래스를 참조해서 property 태그를 통해 파일명 + .jsp를 매칭해주는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726401842622&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;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;
	xmlns:mvc=&quot;http://www.springframework.org/schema/mvc&quot;
	xmlns:util=&quot;http://www.springframework.org/schema/util&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
		http://www.springframework.org/schema/beans https://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
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;
		
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 XML는 View를 제외한 나머지 비즈니스 로직을 담당하는 root-context.xml이다.&amp;nbsp;내부에 DAO, DB를 연결하기 위한 DataSource, TransactionManager등이 추가된다.&lt;/p&gt;</description>
      <category>Spring Framework</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/75</guid>
      <comments>https://untitedblue.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95#entry75comment</comments>
      <pubDate>Mon, 16 Sep 2024 15:53:15 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 스프링 프레임워크에 대한 이해</title>
      <link>https://untitedblue.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 스프링의 첫 글인 스프링 프레임워크에 대한 이해에 대한 글입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- 스프링의 정의 및 구조&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 애플리케이션 개발을 위한 자바(Java)를 기반으로 제작된 오픈소스 프레임워크&lt;/li&gt;
&lt;li&gt;기존 EJB보다 가볍고 배우기 쉽다는 점에서 경량 컨테이너의 기능 수행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제어 역행&lt;/b&gt; (IoC, Inversion of Control)으로 느슨한 결합 제공하며 객체 생명주기의 전반적인 관리 지원 (&lt;b&gt;서블릿 또는 빈 등을 개발자의 코드가 아닌 프레임워크가 직접 수행하는 방식&lt;/b&gt;이며 결합도가 느슨할수록 유지보수 및 개발 용이)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존성 주입&lt;/b&gt; (DI, Dependency Injection)으로 &lt;b&gt;코드의 재사용률을 증가&lt;/b&gt;시키며 &lt;b&gt;클래스 객체를 직접 생성이 아닌 프레임워크에서 생성&lt;/b&gt; 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관점 지향&lt;/b&gt; (AOP, Aspect-Oriented Programming) 지원으로 자원 관리 수행으로 &lt;b&gt;핵심 및 부수 기능 분리 구현&lt;/b&gt;으로 모듈성 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B2shK/btsJmK7kC3u/rmsf48UWqQNgMoIP8PsljK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B2shK/btsJmK7kC3u/rmsf48UWqQNgMoIP8PsljK/img.png&quot; data-alt=&quot;출처 : https://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/html/overview.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B2shK/btsJmK7kC3u/rmsf48UWqQNgMoIP8PsljK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB2shK%2FbtsJmK7kC3u%2Frmsf48UWqQNgMoIP8PsljK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;612&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/html/overview.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 그림은 스프링 프레임워크의 주요 기능을 알려주고 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Core Container는 스프링 프레임워크의 기초 모듈이 포함되어 있다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Core : DI와 IoC를 포함하여 스프링의 기본 부분 제공하는 역할&lt;/li&gt;
&lt;li&gt;Beans : 모든 Beans 객체의 전반적인 생명 주기를 관리하며 Beans Factory는 빈즈의 인스턴스를 생성 또는 빈즈의 의존성 문제를 해결하는 역할&lt;/li&gt;
&lt;li&gt;Context : 애플리케이션 내 각 기능을 담당한느 Bean에 대한 접근 방법 제공 (Bean 객체들의 의존성 주입 담당)&lt;/li&gt;
&lt;li&gt;SpEL : 런타임하는 동안 객체 그래프를 쿼링 및 조작하기 위한 기능 제공하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Data Access and Integration는 데이터베이스나 메시징 같은 데이터를 통한 상호작용을 지원하는 모듈&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JDBC : 쿼리문 형식의 표현을 통한 추상화 형식의 간단한 데이터 표현방법 제공&lt;/li&gt;
&lt;li&gt;ORM : Hibernate나 JPA 같은 객체-관계 매핑 프레임워크 통합 기능 제공&lt;/li&gt;
&lt;li&gt;OXM : 객체 및 XML 매핑 구현을 지원하는 추상화 계층 지원&lt;/li&gt;
&lt;li&gt;JMS : 메세지 생성 및 사용하는 기능 제공&lt;/li&gt;
&lt;li&gt;Transactions : 객체의 선언적 트랜잭션 관리 기능 및 일반 프로그래밍 방식 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Web은 웹 애플리케이션에 대한 빌드(Bulid)를 지원하는 모듈&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Web : 웹 애플리케이션 내 Multipart 파일 업로드 기능 및 IoC 컨테이너 초기화 제공&lt;/li&gt;
&lt;li&gt;WebSocket : 클라이언트와 서버 간의 연결통로 제공&lt;/li&gt;
&lt;li&gt;Servlet : 스프링 내 MVC (Model-View-Controller) 패턴 제공&lt;/li&gt;
&lt;li&gt;Portlet : Web Servlet 모듈의 기능 제공하며 스프링 5 부터는 미지원&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AOP 및 Instrumentation는 관점지향 프로그래밍을 지원하면서 성능 모니터링 및 측정 기능을 지원하는 모듈&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AOP : 핵심과 부수 로직을 분리하여 부가 기능을 모듈화하여 재사용성 증가&lt;/li&gt;
&lt;li&gt;Instrumentation : 오류 확인 및 추적을 위한 성능 모니터링 및 측정 기능 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Aspects는 반복적으로 사용되는 로직에 대한 정보를 담아주고 있으며 주로 로직, 보안, 트랜잭션, 인증, 캐싱 등이 있음&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 스프링의 기본 동작 과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEuA1g/btsJmJghkWh/G4mBGrNC5rhbDvUi1K1Mzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEuA1g/btsJmJghkWh/G4mBGrNC5rhbDvUi1K1Mzk/img.png&quot; data-alt=&quot;스프링 프레임워크의 실행과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEuA1g/btsJmJghkWh/G4mBGrNC5rhbDvUi1K1Mzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEuA1g%2FbtsJmJghkWh%2FG4mBGrNC5rhbDvUi1K1Mzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1287&quot; height=&quot;532&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스프링 프레임워크의 실행과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 이미지는 스프링 프레임워크의 기본 동작을 나타내고 있다. 순서대로 설명하자면 하단과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트가 View를 통해 서버에 요청한다.&lt;/li&gt;
&lt;li&gt;View를 통해 요청받은 내용을 바탕으로 DispatcherSerlvet는 HandlerMapping을 통해 Controller를 찾아서 반환한다.&lt;/li&gt;
&lt;li&gt;찾은 Controller를 기반으로 VO =&amp;gt; DAO =&amp;gt; DB에 접근하여 데이터 처리 후 나오는 결과를 역순으로 Controller에 반환한다.&lt;/li&gt;
&lt;li&gt;다시 DispatcherServlet에 반환받은 데이터를 전송한다.&lt;/li&gt;
&lt;li&gt;전송받은 데이터를 ViewResoler를 통해 View를 찾는다.&lt;/li&gt;
&lt;li&gt;최종적으로 클라이언트에게 반환받은 데이터를 통한 View를 보여준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 DispatcherServlet과 ViewResoler는 web.xml 파일에 포함되어있다. 또한 HandlerMapping은 @RequestMapping이라는 어노테이션을 제공하며 이는 Servlet을 설정하는 xml파일에 포함되어있다.&lt;/p&gt;</description>
      <category>Spring Framework</category>
      <category>AOP</category>
      <category>Framework</category>
      <category>java</category>
      <category>Programming</category>
      <category>spring</category>
      <category>web</category>
      <category>스프링</category>
      <category>웹</category>
      <category>프레임워크</category>
      <category>프로그래밍</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/74</guid>
      <comments>https://untitedblue.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4#entry74comment</comments>
      <pubDate>Sun, 1 Sep 2024 21:43:50 +0900</pubDate>
    </item>
    <item>
      <title>[JSP]JSTL/EL 언어</title>
      <link>https://untitedblue.tistory.com/entry/JSPJSTLEL-%EC%96%B8%EC%96%B4</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 JSTL/EL에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- JSTL/EL이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSP 페이지 내 자바 코드의 최소화를 위해 만들어진 라이브러리&lt;/li&gt;
&lt;li&gt;태그 형식으로 JSP 내 자바 코드를 간결하게 표현가능&lt;/li&gt;
&lt;li&gt;JSTL : JSP Standard Tag Library&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEt3me/btsHUNyqTcC/rHOHKkcydxI6d7rEu0vjbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEt3me/btsHUNyqTcC/rHOHKkcydxI6d7rEu0vjbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEt3me/btsHUNyqTcC/rHOHKkcydxI6d7rEu0vjbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEt3me%2FbtsHUNyqTcC%2FrHOHKkcydxI6d7rEu0vjbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;260&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://repo1.maven.org/maven2/jstl/jstl/1.2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://repo1.maven.org/maven2/jstl/jstl/1.2/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718166291815&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Index of /maven2/jstl/jstl/1.2/&quot; data-og-description=&quot;&quot; data-og-host=&quot;repo1.maven.org&quot; data-og-source-url=&quot;https://repo1.maven.org/maven2/jstl/jstl/1.2/&quot; data-og-url=&quot;https://repo1.maven.org/maven2/jstl/jstl/1.2/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://repo1.maven.org/maven2/jstl/jstl/1.2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://repo1.maven.org/maven2/jstl/jstl/1.2/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Index of /maven2/jstl/jstl/1.2/&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;repo1.maven.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSTL/EL을 사용하기 위해서는 우선 라이브러리를 다운로드 받아야 하며 상단의 링크를 타고 JAR 파일을 다운로드한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSlgJu/btsHVqQjtlI/CKuasKwOaDYOrDp39DFYc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSlgJu/btsHVqQjtlI/CKuasKwOaDYOrDp39DFYc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSlgJu/btsHVqQjtlI/CKuasKwOaDYOrDp39DFYc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSlgJu%2FbtsHVqQjtlI%2FCKuasKwOaDYOrDp39DFYc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;392&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 받은 파일을 &lt;b&gt;프로젝트 내 src &amp;gt; main &amp;gt; webapp &amp;gt; WEB-INF &amp;gt; lib 안에 적용&lt;/b&gt;하면 JSTL 라이브러리를 사용할 모든 준비가 완료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1718166706923&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리를 사용하기 전 반드시 상단의 태그를 입력해야 한다. 이때 prefix와 uri에 따라 JSTL의 기능이 달라진다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.3566%; text-align: center;&quot;&gt;&lt;b&gt;prefix&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7286%; text-align: center;&quot;&gt;&lt;b&gt;url&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.9147%; text-align: center;&quot;&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.3566%;&quot;&gt;c&lt;/td&gt;
&lt;td style=&quot;width: 29.7286%;&quot;&gt;http://java.sun.com/jsp/jstl/core&lt;/td&gt;
&lt;td style=&quot;width: 53.9147%;&quot;&gt;기본 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.3566%;&quot;&gt;fmt&lt;/td&gt;
&lt;td style=&quot;width: 29.7286%;&quot;&gt;http://java.sun.com/jstl/fmt&lt;/td&gt;
&lt;td style=&quot;width: 53.9147%;&quot;&gt;형식화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.3566%;&quot;&gt;sql&lt;/td&gt;
&lt;td style=&quot;width: 29.7286%;&quot;&gt;http://java.sun.com/jstl/sql&lt;/td&gt;
&lt;td style=&quot;width: 53.9147%;&quot;&gt;데이터베이스 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.3566%;&quot;&gt;x&lt;/td&gt;
&lt;td style=&quot;width: 29.7286%;&quot;&gt;http://java.sun.com/jstl/xml&lt;/td&gt;
&lt;td style=&quot;width: 53.9147%;&quot;&gt;XML 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.3566%;&quot;&gt;fn&lt;/td&gt;
&lt;td style=&quot;width: 29.7286%;&quot;&gt;http://java.sun.com/jsp/jstl/fn&lt;/td&gt;
&lt;td style=&quot;width: 53.9147%;&quot;&gt;Function (함수) 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단과 같이 총 다섯 가지로 분류되며 그 중에서 먼저 기본 기능을 다뤄보겠다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- Core 태그&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;태그명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:if&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;조건에 따라 처리 로직을 실행하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:choose&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;여러 조건에 따라 처리 로직을 실행하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:when&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;&amp;lt;c:choose&amp;gt;와 같이 사용되며 PL에서 case 처럼 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:otherwise&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;&amp;lt;c:choose&amp;gt;와 같이 사용되며 PL에서 default 처럼 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:foreach&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;일정한 주기에 맞춰 내부 로직을 반복하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:forToken&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;정해진 구분자를 기점으로 각각이 토큰을 처리하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:set&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;변수에 값을 설정하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:remove&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;변수 내 값을 제거하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:url&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;URL에 자동으로 ContextPath를 붙여주는 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:param&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;파라미터를 전달하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:import&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;외부의 자원을 가져와서 활용하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:redirect&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;지정 경로로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:catch&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;예외처리를 적용하는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;lt;c:out&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;데이터를 출력하는데 사용되며 &amp;lt;%= %&amp;gt;를 대체할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSTL의 종류 중 하나의 Core의 태그는 상단과 같이 있으며 하나씩 실습해보겠다.&lt;/p&gt;
&lt;pre id=&quot;code_1718514390268&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;

&amp;lt;%
pageContext.setAttribute(&quot;msg&quot;, &quot;Hello&quot;);

%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;c:if test=&quot;${msg == 'Hello'}&quot;&amp;gt;
		Hello. today is a JSTL and EL Study day :)
	&amp;lt;/c:if&amp;gt;
	&amp;lt;c:if test=&quot;${msg != 'Hello'}&quot;&amp;gt;
		Nice to meet You :D
	&amp;lt;/c:if&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[JSP]JSTL_003.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sZuv4/btsH1oRoD8o/j1ax5kzk8bih2AYr7u95H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sZuv4/btsH1oRoD8o/j1ax5kzk8bih2AYr7u95H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sZuv4/btsH1oRoD8o/j1ax5kzk8bih2AYr7u95H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsZuv4%2FbtsH1oRoD8o%2Fj1ax5kzk8bih2AYr7u95H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;217&quot; data-filename=&quot;[JSP]JSTL_003.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 코드는 &lt;b&gt;&amp;lt;c:if test&amp;gt;&lt;/b&gt; 태그를 적용한 것이며 msg라는 변수의 값과 조건문 태그에 따라 페이지에 표시되는 문장이 다르다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1718514860275&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;

&amp;lt;%
pageContext.setAttribute(&quot;msg&quot;, &quot;Hi&quot;);

%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;c:choose&amp;gt;
		&amp;lt;c:when test=&quot;${msg == 'Hello'}&quot;&amp;gt;
			Hello. today is a JSTL and EL Study day :)
		&amp;lt;/c:when&amp;gt;
		
		&amp;lt;c:when test=&quot;${msg == 'Hi'}&quot;&amp;gt;
			Nice to meet You :D
		&amp;lt;/c:when&amp;gt;
		
		&amp;lt;c:otherwise&amp;gt;
			NOPE !
		&amp;lt;/c:otherwise&amp;gt;
	&amp;lt;/c:choose&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 코드는 &amp;lt;c:choose&amp;gt;태그를 사용했으며 이전에 &amp;lt;c:if&amp;gt;와 같은 로직이다. &lt;b&gt;&amp;lt;c:choose&amp;gt;를 사용할 때는 내부에 &amp;lt;c:when&amp;gt;과 &amp;lt;c:otherwise&amp;gt;를 사용&lt;/b&gt;해서 조건문에 대한 로직을 생성할 수 있음을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1718516520452&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;1&quot; end=&quot;10&quot; step=&quot;1&quot;&amp;gt;
		${i}번째 반복 &amp;lt;br&amp;gt;
	&amp;lt;/c:forEach&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uK1Fr/btsHZ47Slx1/f8hC70berfzY3mbkX679kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uK1Fr/btsHZ47Slx1/f8hC70berfzY3mbkX679kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uK1Fr/btsHZ47Slx1/f8hC70berfzY3mbkX679kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuK1Fr%2FbtsHZ47Slx1%2Ff8hC70berfzY3mbkX679kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;342&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 코드는 &lt;b&gt;&amp;lt;c:forEach var=&quot;i&quot; begin=&quot;[시작값]&quot; end=&quot;[종료값]&quot; step=&quot;[주기]&quot;&amp;gt;&lt;/b&gt; 태그를 사용하여 반복문을 구현하였다. 내부에 ${[var]}를 적용하여 반복하고 있는 숫자를 화면에 보여줄 수도 있다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1718517684373&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;c:forTokens var=&quot;PL&quot; items=&quot;C/Java/Python/C++/C#/Kotiln&quot; delims=&quot;/&quot;&amp;gt;
		&amp;lt;c:out value=&quot;${PL}&quot;/&amp;gt; &amp;lt;br&amp;gt;
	&amp;lt;/c:forTokens&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KY2WV/btsH17azWhz/izTUDoQVUhYF7EWEirIJKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KY2WV/btsH17azWhz/izTUDoQVUhYF7EWEirIJKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KY2WV/btsH17azWhz/izTUDoQVUhYF7EWEirIJKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKY2WV%2FbtsH17azWhz%2FizTUDoQVUhYF7EWEirIJKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;221&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 &lt;b&gt;&amp;lt;c:forToken var=&quot;[변수명]&quot; items=&quot;[데이터]&quot; delims=&quot;[구분자]&quot;&amp;gt;&lt;/b&gt;태그를 사용해서 배열처럼 되어있는 문자열에서 구분자를 활용해서 값을 나누는 것을 구현한 코드이다. 그리고 이를 표현하기 위해 &lt;b&gt;&amp;lt;c:out value=&quot;${[변수명]}&quot;/&amp;gt;&lt;/b&gt;을 활용했다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1718519390704&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;c:url var=&quot;Paging&quot; value=&quot;/JSTL_Practice002.jsp&quot;&amp;gt;
		&amp;lt;c:param name=&quot;name&quot; value=&quot;홍길동&quot;/&amp;gt;
	&amp;lt;/c:url&amp;gt;
	
	&amp;lt;a href=&quot;${Paging}&quot;&amp;gt;페이지 이동&amp;lt;/a&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 코드는 &lt;b&gt;&amp;lt;c:url var=&quot;[변수명]&quot; value=&quot;[경로]&quot;&amp;gt;과 &amp;lt;c:param name=&quot;[변수명]&quot; value=&quot;[값]&quot;&amp;gt;&lt;/b&gt;을 활용해서 데이터와 함께 세션을 유지하는 방향으로 사이트를 이동하는 기능을 구현하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baAlw2/btsHZ7wJbS0/DEbz4fgZCsraTWVKD6ufQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baAlw2/btsHZ7wJbS0/DEbz4fgZCsraTWVKD6ufQ1/img.png&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;88&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;28.36&quot; style=&quot;width: 28.0315%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baAlw2/btsHZ7wJbS0/DEbz4fgZCsraTWVKD6ufQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaAlw2%2FbtsHZ7wJbS0%2FDEbz4fgZCsraTWVKD6ufQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;217&quot; height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8IJeX/btsH08Bg8dw/TdgyDcOhmKycrUg61OCFB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8IJeX/btsH08Bg8dw/TdgyDcOhmKycrUg61OCFB1/img.png&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;188&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; style=&quot;width: 70.8057%;&quot; data-widthpercent=&quot;71.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8IJeX/btsH08Bg8dw/TdgyDcOhmKycrUg61OCFB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8IJeX%2FbtsH08Bg8dw%2FTdgyDcOhmKycrUg61OCFB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1171&quot; height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 실행하면 param 값과 세션아이디가 동시에 다른 사이트로 넘어가면서 정보와 세션값을 그대로 유지 가능한 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1718522992117&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;c:redirect url=&quot;/JDBC_Select.jsp&quot; context=&quot;/2023_JSP_Study&quot;&amp;gt;
		&amp;lt;c:param name=&quot;user&quot; value=&quot;홍길동&quot;/&amp;gt;
	&amp;lt;/c:redirect&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 코드는 &lt;b&gt;&amp;lt;c:redirect&amp;gt;&lt;/b&gt; 태그를 사용하여 특정 사이트 또는 위치로 리다이렉트 시켜주는 기능을 담당하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WGoFP/btsH00pO4M3/IJpawiKMfeccJMGLM9rUT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WGoFP/btsH00pO4M3/IJpawiKMfeccJMGLM9rUT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WGoFP/btsH00pO4M3/IJpawiKMfeccJMGLM9rUT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWGoFP%2FbtsH00pO4M3%2FIJpawiKMfeccJMGLM9rUT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1521&quot; height=&quot;282&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드를 실행하면 지정해둔 위치로 자동으로 이동되는 점을 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- XML 태그&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%; text-align: center;&quot;&gt;&lt;b&gt;태그명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&amp;lt;x:parse&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%;&quot;&gt;XML 문서를 읽어서 파싱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&amp;lt;x:out&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%;&quot;&gt;XML 내용 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&amp;lt;x:if&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%;&quot;&gt;조건에 따라 내부 로직 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&amp;lt;x:forEach&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%;&quot;&gt;일정 주기 및 데이터 길이에 맞춰 내부 로직 반복하는 데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&amp;lt;x:choose&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%;&quot;&gt;여러 조건에 따라 로직 처리하는 데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&amp;lt;x:when&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%;&quot;&gt;&amp;lt;x:choose&amp;gt;와 함께 사용되며 조건 설정 및 내부 로직 구성에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&amp;lt;x:otherwise&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.7674%;&quot;&gt;&amp;lt;x:choose&amp;gt;와 함께 사용되며 어느 조건에도 부합하지 않을 때 실행되는데 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1719132709170&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;x&quot; uri=&quot;http://java.sun.com/jsp/jstl/xml&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;c:set var=&quot;Sample&quot;&amp;gt;
		  &amp;lt;info&amp;gt;
		    &amp;lt;artist&amp;gt;
		        &amp;lt;name&amp;gt;IVE&amp;lt;/name&amp;gt;
		        &amp;lt;debut&amp;gt;2021&amp;lt;/debut&amp;gt;
		        &amp;lt;agency&amp;gt;STARSHIP Ent.&amp;lt;/agency&amp;gt;
		    &amp;lt;/artist&amp;gt;
		        
		    &amp;lt;artist&amp;gt;
		        &amp;lt;name&amp;gt;asepa&amp;lt;/name&amp;gt;
		        &amp;lt;debut&amp;gt;2020&amp;lt;/debut&amp;gt;
		        &amp;lt;agency&amp;gt;SM Ent.&amp;lt;/agency&amp;gt;
		    &amp;lt;/artist&amp;gt;
		  &amp;lt;/info&amp;gt;
		&amp;lt;/c:set&amp;gt;
	
		&amp;lt;!-- out --&amp;gt;
		&amp;lt;x:parse xml=&quot;${Sample}&quot; var=&quot;output&quot;/&amp;gt;
		&amp;lt;b&amp;gt;아티스트 1&amp;lt;/b&amp;gt; : &amp;lt;x:out select=&quot;$output/info/artist[1]/name&quot; /&amp;gt;
		
		&amp;lt;br&amp;gt;
		
		&amp;lt;b&amp;gt;&amp;lt;x:out select=&quot;$output/info/artist[2]/name&quot; /&amp;gt;의 소속사&amp;lt;/b&amp;gt; : &amp;lt;x:out select=&quot;$output/info/artist[2]/agency&quot; /&amp;gt;
		
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;!-- forEach --&amp;gt;
		&amp;lt;x:forEach select=&quot;$output/info/artist/name&quot; var=&quot;item&quot;&amp;gt;
		    &amp;lt;b&amp;gt;아티스트 명 : &amp;lt;x:out select=&quot;$item&quot; /&amp;gt;&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;
		&amp;lt;/x:forEach&amp;gt;
		
		&amp;lt;br&amp;gt;
		
		&amp;lt;!-- if --&amp;gt;
		&amp;lt;x:if select = &quot;$output//artist&quot;&amp;gt;
		   해당 XML 문서에는 최소 한 명 이상의 아티스트의 정보가 담겨있습니다.
		&amp;lt;/x:if&amp;gt;
		
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; 
		
		&amp;lt;!-- choose --&amp;gt;
		&amp;lt;x:choose&amp;gt;
		  &amp;lt;x:when select=&quot;$output//artist/debut='2021'&quot;&amp;gt;
		    &amp;lt;x:out select=&quot;$output//artist/name&quot;/&amp;gt;은(는) &amp;lt;x:out select=&quot;$output//artist/debut&quot;/&amp;gt;년에 데뷔했습니다.
		  &amp;lt;/x:when&amp;gt;
		  
		  &amp;lt;x:when select=&quot;$output//artist/debut='2020'&quot;&amp;gt;
		    &amp;lt;x:out select=&quot;$output//artist/name&quot;/&amp;gt;은(는) &amp;lt;x:out select=&quot;$output//artist/debut&quot;/&amp;gt;년에 데뷔했습니다.
		  &amp;lt;/x:when&amp;gt;
		  
		  &amp;lt;x:otherwise&amp;gt;
		    NO DATA.
		  &amp;lt;/x:otherwise&amp;gt;
		&amp;lt;/x:choose&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cu4oaX/btsH9eazpJ2/S9GTNHDyCqF6aC6lCGBlyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cu4oaX/btsH9eazpJ2/S9GTNHDyCqF6aC6lCGBlyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cu4oaX/btsH9eazpJ2/S9GTNHDyCqF6aC6lCGBlyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcu4oaX%2FbtsH9eazpJ2%2FS9GTNHDyCqF6aC6lCGBlyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;228&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 코드는 XML JSTL 태그를 활용한 코드이며 이때 경로를 설정할 때는 '/'는 절대경로이며 '//'는 모든경로를 의미한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- Format 태그&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%; text-align: center;&quot;&gt;&lt;b&gt;태그명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;formatNumber&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;숫자를 양식에 맞춰 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;formatDate&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;날짜 정보를 포맷팅하여 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;parseDate&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;문자열 -&amp;gt; 날짜로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;parseNumber&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;문자열 -&amp;gt; 숫자로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;setTimeZone&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;시간대별로 시간을 처리할 수 있는 기능 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;timeZone&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;시간대별로 시간을 처리할 수 있는 기능 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;setLocale&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;로케일 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;requestEncoding&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;요청 파라미터의 인코딩 형식 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;bundle&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;태그 몸체에서 사용할 리소스 번들 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;message(param)&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;메시지 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;setBundle&lt;/td&gt;
&lt;td style=&quot;width: 74.8837%;&quot;&gt;리소스 번들 사용가능하도록 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1719134785569&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		groupingUsed = true : &amp;lt;fmt:formatNumber value=&quot;1000000&quot;/&amp;gt; &amp;lt;br&amp;gt;
		groupingUsed = false : &amp;lt;fmt:formatNumber value=&quot;1000000&quot; groupingUsed=&quot;false&quot;/&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;br&amp;gt;
		
		currency Dollar : &amp;lt;fmt:formatNumber value=&quot;10000&quot; type=&quot;currency&quot;/&amp;gt; &amp;lt;br&amp;gt;
		currency KRW : &amp;lt;fmt:formatNumber value=&quot;10000&quot; type=&quot;currency&quot; currencySymbol=&quot;KRW&quot;/&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;br&amp;gt;
		
		Percent : &amp;lt;fmt:formatNumber value=&quot;0.3&quot; type=&quot;percent&quot;/&amp;gt; &amp;lt;br&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 156px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;속성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; height: 17px;&quot;&gt;var&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; height: 17px;&quot;&gt;출력 결과에 데한 데이터를 대입하는 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; height: 17px;&quot;&gt;scope&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; height: 17px;&quot;&gt;변수에 대한 효력을 지정하는 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; height: 17px;&quot;&gt;value&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; height: 17px;&quot;&gt;형식화 대상 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; height: 17px;&quot;&gt;type&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; height: 17px;&quot;&gt;number, percent, currency 중 하나이며 출력할 포맷 타입 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; height: 17px;&quot;&gt;groupingUsed&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; height: 17px;&quot;&gt;콤마(,) 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; height: 17px;&quot;&gt;pattern&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; height: 17px;&quot;&gt;사용자 지정 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.9302%; height: 17px;&quot;&gt;currencySymbol&lt;/td&gt;
&lt;td style=&quot;width: 79.0698%; height: 17px;&quot;&gt;통화 기호 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ces86o/btsIeIb9f66/ZHH6akjmDLKJM3RvoToUDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ces86o/btsIeIb9f66/ZHH6akjmDLKJM3RvoToUDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ces86o/btsIeIb9f66/ZHH6akjmDLKJM3RvoToUDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fces86o%2FbtsIeIb9f66%2FZHH6akjmDLKJM3RvoToUDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;298&quot; height=&quot;186&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성은 다음과 같으며 상단의 코드를 실행하면 이미지와 같은 결과가 출력되는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719495845438&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;c:set var=&quot;now&quot; value=&quot;&amp;lt;%=new java.util.Date()%&amp;gt;&quot;/&amp;gt;
		
		Original : ${now} &amp;lt;br&amp;gt;
		FormatDate : &amp;lt;fmt:formatDate value=&quot;${now}&quot; type=&quot;date&quot;/&amp;gt;, &amp;lt;fmt:formatDate value=&quot;${now}&quot; type=&quot;time&quot;/&amp;gt;, &amp;lt;fmt:formatDate value=&quot;${now}&quot; type=&quot;both&quot;/&amp;gt; &amp;lt;br&amp;gt;
		
		dateStyle : &amp;lt;fmt:formatDate value=&quot;${now}&quot; dateStyle=&quot;short&quot;/&amp;gt;, &amp;lt;fmt:formatDate value=&quot;${now}&quot; dateStyle=&quot;medium&quot;/&amp;gt;, &amp;lt;fmt:formatDate value=&quot;${now}&quot; dateStyle=&quot;long&quot;/&amp;gt;, &amp;lt;fmt:formatDate value=&quot;${now}&quot; dateStyle=&quot;full&quot;/&amp;gt;, &amp;lt;fmt:formatDate value=&quot;${now}&quot; dateStyle=&quot;default&quot;/&amp;gt;
		&amp;lt;br&amp;gt;
		timeStyle : &amp;lt;fmt:formatDate value=&quot;${now}&quot; timeStyle=&quot;short&quot;/&amp;gt;
		&amp;lt;br&amp;gt;
		pattern : &amp;lt;fmt:formatDate value=&quot;${now}&quot; pattern=&quot;yyyy년 MM월 dd일 hh : mm : ss&quot;/&amp;gt;
		&amp;lt;br&amp;gt;
		&amp;lt;fmt:timeZone value=&quot;GMT&quot;&amp;gt;
		timeZone : &amp;lt;fmt:formatDate value=&quot;${now}&quot; /&amp;gt;
		&amp;lt;/fmt:timeZone&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 156px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;속성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;var&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;출력 결과에 데한 데이터를 대입하는 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;scope&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;변수에 대한 효력을 지정하는 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;value&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;형식화 대상 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;type&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;형식화할 데이터 종류이며 time, date, both 중 하나 사용 가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;dateStyle&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;지정된 날짜 형식이며 default, short, mediun, long 중 하나 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;timeStyle&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;지정된 시간 형식이며 default, short, mediun, long 중 하나 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;pattern&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;사용자 지정 형식 스타일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.7675%; height: 17px;&quot;&gt;timeZone&lt;/td&gt;
&lt;td style=&quot;width: 80.2325%; height: 17px;&quot;&gt;타임존 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QIKiZ/btsIfWG1RgQ/gfPmAMqlkp6Kks0QGPzxK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QIKiZ/btsIfWG1RgQ/gfPmAMqlkp6Kks0QGPzxK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QIKiZ/btsIfWG1RgQ/gfPmAMqlkp6Kks0QGPzxK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQIKiZ%2FbtsIfWG1RgQ%2FgfPmAMqlkp6Kks0QGPzxK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;157&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성은 다음과 같이 구성되어 있으며 상단의 소스코드를 출력하면 상단의 이미지와 같은 결과를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719496361114&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;c:set var=&quot;now&quot; value=&quot;&amp;lt;%=new java.util.Date()%&amp;gt;&quot;/&amp;gt;
		
		&amp;lt;fmt:setLocale value=&quot;ko_kr&quot;&amp;gt;&amp;lt;/fmt:setLocale&amp;gt;
			&amp;lt;fmt:formatDate value=&quot;${now}&quot; type=&quot;both&quot;/&amp;gt;
			&amp;lt;fmt:formatNumber type=&quot;currency&quot; value=&quot;100000&quot;/&amp;gt;
		
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;fmt:setLocale value=&quot;ja_JP&quot;&amp;gt;&amp;lt;/fmt:setLocale&amp;gt;
			&amp;lt;fmt:formatDate value=&quot;${now}&quot; type=&quot;both&quot;/&amp;gt;
			&amp;lt;fmt:formatNumber type=&quot;currency&quot; value=&quot;100000&quot;/&amp;gt;
			
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;fmt:setLocale value=&quot;en_US&quot;&amp;gt;&amp;lt;/fmt:setLocale&amp;gt;
			&amp;lt;fmt:formatDate value=&quot;${now}&quot; type=&quot;both&quot;/&amp;gt;
			&amp;lt;fmt:formatNumber type=&quot;currency&quot; value=&quot;100000&quot;/&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/up15i/btsIe1P5YUl/GUyHXyRJsWs4AdccWm7HK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/up15i/btsIe1P5YUl/GUyHXyRJsWs4AdccWm7HK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/up15i/btsIe1P5YUl/GUyHXyRJsWs4AdccWm7HK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fup15i%2FbtsIe1P5YUl%2FGUyHXyRJsWs4AdccWm7HK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;135&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 formatDate, formatNumber를 사용하기 전에 &amp;lt;fmt:setLoacle value=&quot;[국가]&quot;&amp;gt;&amp;lt;/fmt:setLocale&amp;gt;를 선언해주면 해당 국가에 맞는 통화기호와 시차에 의거한 날짜 및 시간 및 표기법까지 출력되는 점을 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- SQL&lt;/h3&gt;
&lt;pre id=&quot;code_1719496755352&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot; %&amp;gt;
&amp;lt;sql:setDataSource driver=&quot;[com.oracle.jdbc.Driver]&quot; url=&quot;[URL]&quot; user=&quot;[USER]&quot;, password=&quot;[PSWD]&quot; var=&quot;[VALUE]&quot;, scope=&quot;[page | request | session | application]&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 코드는 웹과 데이터베이스와 연결을 위한 필수적인 요소이다.&lt;/p&gt;
&lt;pre id=&quot;code_1719497276078&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;sql:query var=&quot;val01&quot; dataSource=&quot;${dataSource}&quot;&amp;gt;
	SELECT * FROM TAB;
&amp;lt;/sql:query&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 sql:query 태그는 SELECT 쿼리문을 실행하는데 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1719498568598&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;sql:setDataSource driver=&quot;oracle.jdbc.driver.OracleDriver&quot; url=&quot;jdbc:oracle:thin:@localhost:1521:orcl&quot; user=&quot;scott&quot; password=&quot;1234&quot; var=&quot;dataSource&quot; scope=&quot;page&quot;/&amp;gt;
		&amp;lt;sql:query var=&quot;resultSet&quot; dataSource=&quot;${dataSource }&quot;&amp;gt;
			SELECT * FROM DEPT
		&amp;lt;/sql:query&amp;gt;
		
		&amp;lt;table border=&quot;1&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;c:forEach items=&quot;${resultSet.columnNames}&quot; var=&quot;col_print&quot;&amp;gt;
					&amp;lt;th&amp;gt;${col_print}&amp;lt;/th&amp;gt;
				&amp;lt;/c:forEach&amp;gt;
				&amp;lt;c:forEach items=&quot;${resultSet.rowsByIndex}&quot; var=&quot;row_print&quot;&amp;gt;
				&amp;lt;tr&amp;gt; 
					&amp;lt;c:forEach items=&quot;${row_print}&quot; var=&quot;row_print_row&quot;&amp;gt;
						&amp;lt;td&amp;gt;${row_print_row}&amp;lt;/td&amp;gt;
					&amp;lt;/c:forEach&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;/c:forEach&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/expcfp/btsIfGEsNJz/Q0UOrBOIq8WBcAYmxDkVJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/expcfp/btsIfGEsNJz/Q0UOrBOIq8WBcAYmxDkVJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/expcfp/btsIfGEsNJz/Q0UOrBOIq8WBcAYmxDkVJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fexpcfp%2FbtsIfGEsNJz%2FQ0UOrBOIq8WBcAYmxDkVJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;197&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 &amp;lt;sql:query&amp;gt; 태그를 사용 후 그에 대한 데이터가 출력되며 이를 토대로 &amp;lt;c:forEach&amp;gt;와 변수명.columsNames와 변수명.rowsByIndex를 사용하여 데이터를 웹 화면에 출력할 수 있는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719498797633&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;sql:update dataSource=&quot;${dataSource}&quot;&amp;gt;
	INSERT INTO DEPT VALUES(?,?,?)
		
	&amp;lt;sql:param value=&quot;50&quot;/&amp;gt;
	&amp;lt;sql:param value=&quot;=IT Dept.&quot;/&amp;gt;
	&amp;lt;sql:param value=&quot;Korea&quot;/&amp;gt;
&amp;lt;/sql:update&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 &amp;lt;sql:update&amp;gt; 태그를 사용하여 데이터와 대한 입력, 수정, 삭제 작업이 가능한 점을 확인할 수 있으며 &amp;lt;sql:param&amp;gt; 태그를 사용하여 사용할 값을 지정할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- Fn 태그&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 188px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;태그&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 20px;&quot;&gt;fn.toLowerCase(String)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 20px;&quot;&gt;String 문자열의 알파벳을 소문자로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 20px;&quot;&gt;fn.toUpperCase(String)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 20px;&quot;&gt;String 문자열의 알파벳을 대문자로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 17px;&quot;&gt;fn.substring(String, begin, end)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 17px;&quot;&gt;String 문자열에서 begin에서부터 end까지의 문자열 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 17px;&quot;&gt;fn.substringBefore(String, substr)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 17px;&quot;&gt;String 문자열에서 substr 이전의 문자 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 17px;&quot;&gt;fn.subStringAfter(String, substr)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 17px;&quot;&gt;String 문자열에서 substr 이후의 문자 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 17px;&quot;&gt;fn.trim(String)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 17px;&quot;&gt;String 문자열의 앞뒤 공백 모두 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 20px;&quot;&gt;fn.length(String)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 20px;&quot;&gt;String 문자열의 글자의 갯수 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 20px;&quot;&gt;fn.replace(String, before, after)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 20px;&quot;&gt;String 문자열에서 이전 문자를 새로운 문자로 대&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.0697%; height: 20px;&quot;&gt;fn.join(array[], separator)&lt;/td&gt;
&lt;td style=&quot;width: 70.9303%; height: 20px;&quot;&gt;배열을 특정 문자를 기점으로 각각의 문자열로 분리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- EL 표현언어&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.093%; text-align: center;&quot;&gt;&lt;b&gt;객체&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 82.907%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.093%;&quot;&gt;param&lt;/td&gt;
&lt;td style=&quot;width: 82.907%;&quot;&gt;파라미터의 값 담고 있는 객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.093%;&quot;&gt;paramValues&lt;/td&gt;
&lt;td style=&quot;width: 82.907%;&quot;&gt;동일 명의 파라미터 값들을 배열 형태로 담고 있는 객&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1719508342005&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;form action=&quot;Result.jsp&quot; method=&quot;GET&quot;&amp;gt;
			ID : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot; id=&quot;id&quot;/&amp;gt; &amp;lt;br&amp;gt;
			PW : &amp;lt;input type=&quot;password&quot; name=&quot;pwd&quot; id=&quot;pwd&quot;/&amp;gt; &amp;lt;br&amp;gt;
			
			&amp;lt;br&amp;gt;
			
			&amp;lt;input type=&quot;checkbox&quot; name=&quot;dept&quot; value=&quot;인문사회&quot;&amp;gt; 인문사회
			&amp;lt;input type=&quot;checkbox&quot; name=&quot;dept&quot; value=&quot;자연계열&quot;&amp;gt; 자연계열
			&amp;lt;input type=&quot;checkbox&quot; name=&quot;dept&quot; value=&quot;공학&quot;&amp;gt; 공학
			&amp;lt;input type=&quot;checkbox&quot; name=&quot;dept&quot; value=&quot;예체능&quot;&amp;gt; 예체능
			
			&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
			
			&amp;lt;input type=&quot;submit&quot;/&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1719508356633&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	Result : ${param.id}, ${param.pwd} &amp;lt;br&amp;gt;
	Dept : 
	
	&amp;lt;c:forEach items=&quot;${paramValues.dept}&quot; var=&quot;dept&quot;&amp;gt;
	 	${dept} 
	&amp;lt;/c:forEach&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQLKu/btsIeeCtABQ/jByj9K1xAeVeFDqYwzzj2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQLKu/btsIeeCtABQ/jByj9K1xAeVeFDqYwzzj2K/img.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;166&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.9875%; margin-right: 10px;&quot; data-widthpercent=&quot;50.58&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQLKu/btsIeeCtABQ/jByj9K1xAeVeFDqYwzzj2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQLKu%2FbtsIeeCtABQ%2FjByj9K1xAeVeFDqYwzzj2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;392&quot; height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csKjEm/btsIfdbJBLV/3PYkgE2Q8k1wMUMdGSBFX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csKjEm/btsIfdbJBLV/3PYkgE2Q8k1wMUMdGSBFX1/img.png&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;91&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.8497%;&quot; data-widthpercent=&quot;49.42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csKjEm/btsIfdbJBLV/3PYkgE2Q8k1wMUMdGSBFX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsKjEm%2FbtsIfdbJBLV%2F3PYkgE2Q8k1wMUMdGSBFX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;210&quot; height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드는 EL 표현 언어를 사용하여 form 태그에서 입력했던 데이터를 전송했을 때 기존에는 request.getParameter(&quot;[name]&quot;)을 사용했던 것을 간결하게 표현해서 전송한 데이터를 보여주는 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>JSP&amp;amp;Servlet</category>
      <category>El</category>
      <category>jsp</category>
      <category>jstl</category>
      <category>Programming</category>
      <category>Servlet</category>
      <category>web</category>
      <category>웹</category>
      <category>코딩</category>
      <category>표현언어</category>
      <category>프로그래밍</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/73</guid>
      <comments>https://untitedblue.tistory.com/entry/JSPJSTLEL-%EC%96%B8%EC%96%B4#entry73comment</comments>
      <pubDate>Fri, 28 Jun 2024 03:00:13 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] cos.jar를 활용한 파일 업로드</title>
      <link>https://untitedblue.tistory.com/entry/JSP-cosjar%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 파일 업로드에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- cos.jar&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSP&amp;amp;Servlet에서 파일 업로드 기능을 구현하기 위한 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.servlets.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://www.servlets.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1717934814630&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Servlets.com&quot; data-og-description=&quot;Home What's New? COS File Upload Library Servlet Polls Mailing Lists Servlet Engines Servlet ISPs Servlet Tools Documentation Online Articles The Soapbox &amp;quot;Java Servlet Programming, Second Edition&amp;quot; &amp;quot;Java Enterprise Best Practices&amp;quot; Speaking &amp;amp; Slides About Ja&quot; data-og-host=&quot;www.servlets.com&quot; data-og-source-url=&quot;http://www.servlets.com/&quot; data-og-url=&quot;http://www.servlets.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://www.servlets.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.servlets.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Servlets.com&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Home What's New? COS File Upload Library Servlet Polls Mailing Lists Servlet Engines Servlet ISPs Servlet Tools Documentation Online Articles The Soapbox &quot;Java Servlet Programming, Second Edition&quot; &quot;Java Enterprise Best Practices&quot; Speaking &amp;amp; Slides About Ja&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.servlets.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QePyL/btsHTlNZdmj/YsOZ8k9ULVnSZMAsMzBc10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QePyL/btsHTlNZdmj/YsOZ8k9ULVnSZMAsMzBc10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QePyL/btsHTlNZdmj/YsOZ8k9ULVnSZMAsMzBc10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQePyL%2FbtsHTlNZdmj%2FYsOZ8k9ULVnSZMAsMzBc10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;792&quot; height=&quot;380&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 사이트로 접속하면 좌측에 com.oreilly.servlet이 있는데 클릭 후 최하단으로 스크롤을 내리면 이미지처럼 다운로드 링크가 있을 것이다. 이를 통해 라이브러리를 다운로드해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deSq08/btsHTWf2NEG/XSEbjKCDEkt1fyxvuyhlRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deSq08/btsHTWf2NEG/XSEbjKCDEkt1fyxvuyhlRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deSq08/btsHTWf2NEG/XSEbjKCDEkt1fyxvuyhlRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeSq08%2FbtsHTWf2NEG%2FXSEbjKCDEkt1fyxvuyhlRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;422&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 이클립스(또는 인텔리제이)를 실행하여 적용하고자 하는 &lt;b&gt;프로젝트 안에 있는 src &amp;gt; main &amp;gt; webapp &amp;gt; WEB-INF &amp;gt; lib&lt;/b&gt; 폴더 안에 파일을 넣어서 적용해주면 cos.jar 라이브러리를 사용하기 위한 모든 준비가 완료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937451862&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;FileUploadForm1&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;h2&amp;gt;FileUpload&amp;lt;/h2&amp;gt;
	
	&amp;lt;form action=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/File.do&quot; name=&quot;FileUpload&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
		&amp;lt;input type=&quot;file&quot; name=&quot;FileInfo&quot;&amp;gt;
		&amp;lt;input type=&quot;submit&quot; name=&quot;업로드&quot;&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be4Qqr/btsHSAE4OXR/XKIIm0QsIkeqqBJqQVBci0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be4Qqr/btsHSAE4OXR/XKIIm0QsIkeqqBJqQVBci0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be4Qqr/btsHSAE4OXR/XKIIm0QsIkeqqBJqQVBci0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe4Qqr%2FbtsHSAE4OXR%2FXKIIm0QsIkeqqBJqQVBci0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;122&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 JSP 소스코드는 파일을 업로드하기 위한 폼 양식을 구현하고 있다. 이때 필수적으로 사용하는 태그는 form과 input가 있는데 form 안에 속성은 enctype=&quot;multipart/form-data&quot; 및 method=&quot;post&quot;를 사용해야 한다. 또한 내부에 input type은 file과 submit이 있어야만 업로드할 파일을 선택하고 제출해서 서버에 업로드할 수 있다. 이제 백엔드 코드를 살펴보자.&lt;/p&gt;
&lt;pre id=&quot;code_1717937685625&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package Testing;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

@WebServlet(&quot;/File.do&quot;)
public class FileController extends HttpServlet {
    public FileController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append(&quot;Served at: &quot;).append(request.getContextPath());
		
		String fileSavePath = &quot;C:/Users/users/Documents/eclipse-jee-2023-03-R-win32-x86_64/eclipse/WorkSpace/2023_JSP_Study/src/main/webapp/FileDict&quot;;
		String encType = &quot;EUC-KR&quot;;
		int maxSize = 100*1024*1024; // 100MB
		
		try {
			MultipartRequest multi = null;
			multi = new MultipartRequest(request, fileSavePath, maxSize, encType, new DefaultFileRenamePolicy());
			Enumeration params = multi.getParameterNames();
			
			while (params.hasMoreElements()) {
				String name = (String)params.nextElement();
				String value = multi.getParameter(name);
				System.out.println(&quot;name : &quot; + name + &quot;, value : &quot; + value);
			}
			
			Enumeration files = multi.getFileNames();
			
			while(files.hasMoreElements()) {
				String name = (String) files.nextElement();
				
				String fileName = multi.getFilesystemName(name);
				String original = multi.getOriginalFileName(name);
				String type = multi.getContentType(name);
				
				File f = multi.getFile(name);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		RequestDispatcher rd = request.getRequestDispatcher(&quot;/FileUploadTest.jsp&quot;);
		
		rd.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 코드는 cos.jar 라이브러리를 적용해서 파일 업로드를 구현해주는 소스코드이다. 먼저 MultipartRequest 클래스를 이해해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MultipartRequest multi = new MultipartRequest(HttpServletRequest request, String saveDirectory, int maxSize, String encoding, FileRenamePolicy policy)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;MultipartRequest&lt;span&gt; 클래스를 사용하기 위해서는 먼저 상단의 생성자를 통한 객체를 생성해줘야 한다. 매개변수는 크게 5개를 사용하는데 saveDirectory는 파일을 저장할 경로를 뜻하며 maxSize는 업로드 최대 허용 용량크기, encoding은 인코딩 타입을 의미한다. 나머지 두 개 중 마지막에 있는 FileRenamePolicy policy은 보통 new Default &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;FileRenamePolicy()를 사용하는데 이는 기존에 업로드한 파일명과 업로드될 파일명이 같을 경우 덮어쓰기를 방지하기 위해 사용되고 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 156px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;리턴 타입&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getContentType(String name)&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;업로드된 파일의 형식을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getFile(String name)&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;File&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;업로드된 파일의 객체를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getFileNames()&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;Enumeration&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;프론트 내 input type=&quot;file&quot;으로 된 파라미터의 이름 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getFilesystemName(String name)&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;실제로 업로드된 파일명을 문자열로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getOriginalFileName(String name)&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;업로드된 파일명을 반환하나 중복 가능성 고려하여 변경 전 이름 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getParameter(String name)&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;객체에 있는 파라미터를 문자열로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getParameterNames()&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;Enumeration&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;모든 파라미터의 이름 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.3488%; height: 17px;&quot;&gt;.getParameterValues(String name)&lt;/td&gt;
&lt;td style=&quot;width: 12.907%; height: 17px;&quot;&gt;String[]&lt;/td&gt;
&lt;td style=&quot;width: 56.7442%; height: 17px;&quot;&gt;폼으로부터 전송된 파라미터를 배열로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 메서드 8개는 파일 업로드 기능을 구현하기 위해 자주 사용되는 메서드다.&lt;/p&gt;</description>
      <category>JSP&amp;amp;Servlet</category>
      <category>cos.jar</category>
      <category>fileupload</category>
      <category>jsp</category>
      <category>Programming</category>
      <category>Servlet</category>
      <category>백엔드</category>
      <category>서블릿</category>
      <category>웹프로그래밍</category>
      <category>파일업로드</category>
      <category>프로그래밍</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/72</guid>
      <comments>https://untitedblue.tistory.com/entry/JSP-cosjar%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C#entry72comment</comments>
      <pubDate>Wed, 12 Jun 2024 13:06:05 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 트리거 (Trigger)</title>
      <link>https://untitedblue.tistory.com/entry/SQL-%ED%8A%B8%EB%A6%AC%EA%B1%B0-Trigger</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 트리거에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- 트리거(Trigger)란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 내 특정 이벤트(상황, 동작)이 발생할 때 자동으로 실행되는 기능을 정의하는 PL/SQL 서브 프로그램&lt;/li&gt;
&lt;li&gt;특정 데이터 또는 작업과 연관된 여러 작업을 통합하여 한 번에 수행가능&lt;/li&gt;
&lt;li&gt;복잡한 데이터 규칙을 정의하여 데이터 처리 가능&lt;/li&gt;
&lt;li&gt;데이터 변경 관련 일련의 정보 기록 가능함으로써 데이터 보안성, 안정성 보장가능하며 문제 시 대처 능력 기대 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716123585239&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE [트리거명]

BEFORE [|| AFTER]
	INSERT || UPDATE || DELETE ON [테이블명]

REFERENCING OLD AS old || NEW AS new

FOR EACH ROW WHEN [조건식]

FOLLOWS [트리거명]

ENABLE || DISABLE

DECLARE
	[선언부]
    
BEGIN
	[실행 로직]
 
EXCEPTION
	[예외 처리부]

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BEFORE, AFTER : 트리거가 작동할 타이밍 지정하는 역할 담당 (명령어 실행 전과 후로 분류)&lt;/li&gt;
&lt;li&gt;INSERT, UPDATE, DELETE ON [테이블명] : 트리거가 작동할 DML 명령어 지정하며 여러 개일 경우 || (OR) 사용&lt;/li&gt;
&lt;li&gt;REFERENCING OLD AS OLD, NEW AS NEW : 생략 가능하며 DML로 인해 변경되는 행의 변경 전과 후를 참조하는데 사용&lt;/li&gt;
&lt;li&gt;FOR EACH ROW WHEN [조건식] : 생략 가능하며 DML 명령어에 영향받는 행별로 실행할 지 한 번만 실행할 지를 결정하는 역할 담당&lt;/li&gt;
&lt;li&gt;FOLLOWS [트리거명] : 생략 가능하며 여러 관련된 트리거 실행 순서 지정하는 역할 담당&lt;/li&gt;
&lt;li&gt;ENABLE, DISABLE : 생략 가능하며 트리거의 활성화 여부 체크하는 역할 담당&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716124011593&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER TEST_TRIG_001

BEFORE
    INSERT OR UPDATE ON STUDENT_INFO

    FOR EACH ROW

BEGIN
       IF INSERTING THEN
           INSERT INTO STUDENT_INFO_LOG (STU_NAME, STU_NUM, STU_GRADE, STU_COLLAGE, STU_DEPT, STU_ACA, STU_GENDER, ADD_DATE, CUD_TYPE)
           VALUES (:NEW.STU_NAME, :NEW.STU_NUM, :NEW.STU_GRADE, :NEW.STU_COLLAGE, :NEW.STU_DEPT, :NEW.STU_ACA, :NEW.STU_GENDER, SYSDATE, 'C');
       ELSIF UPDATING THEN
           INSERT INTO STUDENT_INFO_LOG (STU_NAME, STU_NUM, STU_GRADE, STU_COLLAGE, STU_DEPT, STU_ACA, STU_GENDER, ADD_DATE, CUD_TYPE)
           VALUES (:NEW.STU_NAME, :NEW.STU_NUM, :NEW.STU_GRADE, :NEW.STU_COLLAGE, :NEW.STU_DEPT, :NEW.STU_ACA, :NEW.STU_GENDER, SYSDATE, 'U');
       ELSE
           RAISE_APPLICATION_ERROR(-20003, 'ETC ERROR');
       END IF;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 쿼리문은 학생정보 테이블에 대한 CRUD 작업 시 학번에 대한 정보를 처리했던 이력을 관리하기 위한 트리거이다. 이때 작동할 타이밍은 BEFORE로 설정하였으며 명령어 실행 전 해당 트리거가 작동되며 작동 후 DML 명령어에 대한 실행 결과가 발생하는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1716124122761&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM USER_TRIGGERS;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coKs3l/btsHtNyz8FJ/c1NCm5tNEzZcZQ3skbP2lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coKs3l/btsHtNyz8FJ/c1NCm5tNEzZcZQ3skbP2lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coKs3l/btsHtNyz8FJ/c1NCm5tNEzZcZQ3skbP2lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoKs3l%2FbtsHtNyz8FJ%2Fc1NCm5tNEzZcZQ3skbP2lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1586&quot; height=&quot;205&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 USER_TRIGGERS 데이터 사전을 사용하면 본인이 만들었던 트리거를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1717672094496&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO STUDENT_INFO 
VALUES ('김땡땡', '20226459', '3', '간호대학', '간호학과', '재학', '남자');

UPDATE STUDENT_INFO
   SET STU_ACA = '휴학'
 WHERE STU_NUM = '20226459';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단처럼 INSERT와 UPDATE문을 실행하면 트리거가 작동할 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1587&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B58mT/btsHPaHseZm/7QZ4rIEcsdaXiF6Jqiusq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B58mT/btsHPaHseZm/7QZ4rIEcsdaXiF6Jqiusq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B58mT/btsHPaHseZm/7QZ4rIEcsdaXiF6Jqiusq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB58mT%2FbtsHPaHseZm%2F7QZ4rIEcsdaXiF6Jqiusq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1587&quot; height=&quot;210&quot; data-origin-width=&quot;1587&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 후 트리거에서 INSERT 대상이었던 STUDENT_INFO_LOG 테이블을 조회하면 다음과 같이 이력이 저장되어있는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1717673239037&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER TEST_TRIG_002

AFTER
    DELETE ON STUDENT_INFO

    FOR EACH ROW

BEGIN
       IF DELETING THEN
           INSERT INTO STUDENT_INFO_LOG (STU_NAME, STU_NUM, STU_GRADE, STU_COLLAGE, STU_DEPT, STU_ACA, STU_GENDER, ADD_DATE, CUD_TYPE)
           VALUES (:OLD.STU_NAME, :OLD.STU_NUM, :OLD.STU_GRADE, :OLD.STU_COLLAGE, :OLD.STU_DEPT, :OLD.STU_ACA, :OLD.STU_GENDER, SYSDATE, 'D');
       ELSE
           RAISE_APPLICATION_ERROR(-20003, 'ETC ERROR');
       END IF;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 삭제할 때 작동하는 트리거를 실행할 것인데, 이때 이전과는 다르게 AFTER와 OLD 키워드를 사용하였다. 이를 통해 상단의 트리거가 DML문이 실행된 후에 트리거가 작동하는 것과 동시에 OLD 키워드를 통해 갱신 또는 삭제 이전의 데이터를 의미한다는 점을 알 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1717674603403&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELETE FROM STUDENT_INFO WHERE STU_NUM = '20226459';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1587&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBR8tH/btsHQkPMJBQ/MUKh3mR9D4uqlMJ2mggSx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBR8tH/btsHQkPMJBQ/MUKh3mR9D4uqlMJ2mggSx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBR8tH/btsHQkPMJBQ/MUKh3mR9D4uqlMJ2mggSx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBR8tH%2FbtsHQkPMJBQ%2FMUKh3mR9D4uqlMJ2mggSx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1587&quot; height=&quot;165&quot; data-origin-width=&quot;1587&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 상단의 쿼리문을 실행하면 이미지처럼 트리거가 실행되면서 삭제한 이력이 테이블에 저장된 점을 확인할 수 있으며 효율적인 이력관리 및 손쉬운 복구가 가능한 점을 알 수 있다.&lt;/p&gt;</description>
      <category>Database/SQL</category>
      <category>Database</category>
      <category>oracle</category>
      <category>PL/SQL</category>
      <category>SQL</category>
      <category>Trigger</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <category>쿼리문</category>
      <category>트리거</category>
      <category>프로그래밍</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/71</guid>
      <comments>https://untitedblue.tistory.com/entry/SQL-%ED%8A%B8%EB%A6%AC%EA%B1%B0-Trigger#entry71comment</comments>
      <pubDate>Thu, 6 Jun 2024 20:54:05 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 함수 (Function)</title>
      <link>https://untitedblue.tistory.com/entry/SQL-%ED%95%A8%EC%88%98-Function</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 함수에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- 함수란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL문과 프로시저, 트리거에서 다양하게 사용가능하며 함수 안에 로직을 생성하여 사용하는 키워드&lt;/li&gt;
&lt;li&gt;프로그래밍 언어에 비유하면 메서드 (Method)와 유사한 개념&lt;/li&gt;
&lt;li&gt;프로시저와 다르게 IN 파라미터만 사용가능&lt;/li&gt;
&lt;li&gt;반드시 최소 하나의 값은 반환해야 하며 RETURN 키워드를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716033366760&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE [OR REPLACE] FUNCTION [함수명] (
	[변수명] IN [자료형],
    ...
    [변수명] IN [자료형]
)

RETURN [자료형]

IS
	[변수명] [자료형] := [값 또는 식];
BEGIN
	[내부 로직];
	RETURN [값 또는 식];
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 구성하는 내부 로직은 상단과 같다. 첫 번째 라인에 있는 CREATE OR REPLACE [함수명]은 프로시저처럼 함수를 생성하면서 동일한 이름의 함수가 있으면 덮어쓰기처럼 대체하겠다는 키워드로 시작한다. 이후 파라미터를 지정하고 RETURN [자료형]을 통해 함수 실행 후 반환받을 값에 대한 자료형을 지정하며 BEGIN문 내부에 RETURN 옆에 반환 값 또는 식을 지정함으로써 반환 값을 설정하는 것을 끝으로 함수를 끝마치는 구조인 점을 확인할 수 있다. 삭제할 때는 DROP FUNCTION [함수명];을 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1716033838350&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION TEST_FUNC_001 (
    BRITH IN NUMBER
)

RETURN NUMBER

IS
    TODAY DATE := SYSDATE;

BEGIN
    RETURN ROUND(TO_NUMBER(TODAY - TO_DATE(BRITH)) / 365, 1);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 PL/SQL문은 생년월일을 입력하면 작성자의 만 나이를 계산해주는 함수이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716034057700&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    BIRTH NUMBER;
    RESULT VARCHAR2(100);
BEGIN
   BIRTH := 19960518;
   RESULT := TEST_FUNC_001(BIRTH);

   DBMS_OUTPUT.PUT_LINE('RESULT : ' || RESULT);
END;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GRTws/btsHudXyuTm/bTMs2kqKCn5FwjRUlEuhK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GRTws/btsHudXyuTm/bTMs2kqKCn5FwjRUlEuhK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GRTws/btsHudXyuTm/bTMs2kqKCn5FwjRUlEuhK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGRTws%2FbtsHudXyuTm%2FbTMs2kqKCn5FwjRUlEuhK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;310&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 실행해보면 다음과 같이 내부 로직에 의거하여 결과를 출력할 수 있는 점을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716034815282&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT TEST_FUNC_001(19960518) FROM DUAL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 DECLARE, BEGIN, END문을 사용해서 일일이 함수를 실행하기에는 상대적으로 번거롭다. 그래서 FROM DUAL을 통해 상단 쿼리문처럼 SQL문에서 함수를 선언해서 직접적으로 실행시킬 수도 있다. 차이점이 있다고 하면 PL/SQL문으로 실행하는 함수는 콘솔창에 결과가 출력되고 쿼리문에서 실행하는 함수는 테이블 형식으로 결과가 나오며 데이터 조회 및 처리할 때 상대적으로 다양하고 유연하게 적용시킬 수 있다는 점이 존재한다.&lt;/p&gt;</description>
      <category>Database/SQL</category>
      <category>Database</category>
      <category>function</category>
      <category>oracle</category>
      <category>PL/SQL</category>
      <category>SQL</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <category>프로그래밍</category>
      <category>함수</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/70</guid>
      <comments>https://untitedblue.tistory.com/entry/SQL-%ED%95%A8%EC%88%98-Function#entry70comment</comments>
      <pubDate>Sat, 18 May 2024 21:24:26 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 프로시저 (Procedure)</title>
      <link>https://untitedblue.tistory.com/entry/SQL-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80-Procedure</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 프로시저에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- 프로시저란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 처리 작업을 수행하기 위해 사용하는 저장 서브프로그램&lt;/li&gt;
&lt;li&gt;일정한 논리와 로직에 의거하여 데이터 처리 작업을 수행하는 역할 담당&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1715500929368&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE [OR REPLACE] PROCEDURE [프로시저명]

IS [AS]
	[변수명] [자료형] := [값 또는 식];
BEGIN
	[내부 로직];
EXCEPTION
	[예외 시 실행 로직];
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로시저의 구조는 다음과 같이 진행되며 각 구문에 대한 설명은 하단과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CREATE PROCEDURE : 프로시저를 생성하기 위한 구문이며 CREATE 뒤에 OR REPLACE를 추가하면 현재 작성한 내용으로 새로 대체되며 나중에 프로시저를 수정하는 작업할 때 주로 활용되고 있음&lt;/li&gt;
&lt;li&gt;IS, AS, BEGIN : 선언부를 의미하며 선언부 내 변수를 지정하지 않아도 반드시 선언해야 함&lt;/li&gt;
&lt;li&gt;EXCEPTION : 예외부를 의미하며 실행 중 예외 상황에 대처하기 위한 구간 (선택)&lt;/li&gt;
&lt;li&gt;END : 프로시저의 끝을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1715501481727&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE TEST_PROC
IS
    V_NAME VARCHAR2(100) := '김땡땡';
    V_DEPT VARCHAR2(150) := '컴퓨터공학과';
    V_AGE NUMBER(10) := 26;
BEGIN
    DBMS_OUTPUT.PUT_LINE('V_NAME : ' || V_NAME);
    DBMS_OUTPUT.PUT_LINE('V_DEPT : ' || V_DEPT);
    DBMS_OUTPUT.PUT_LINE('V_AGE : ' || V_AGE);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CILIq/btsHow9V0VR/RGpaa0y5H7LLLsI72QlFR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CILIq/btsHow9V0VR/RGpaa0y5H7LLLsI72QlFR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CILIq/btsHow9V0VR/RGpaa0y5H7LLLsI72QlFR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCILIq%2FbtsHow9V0VR%2FRGpaa0y5H7LLLsI72QlFR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;252&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 프로시저를 생성하는 역할을 담당하고 있다. 해당 쿼리문을 실행해보면 Console창에 completed in 218 ms 같이 생성 및 대체가 완료되었다는 알림과 함께 목록에서 프로시저가 정상적으로 반영된 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715501703098&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SET SERVEROUTPUT ON;
EXECUTE TEST_PROC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 SQL*PLUS 기준으로 상단처럼 실행하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1715501761861&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
    SCOTT.TEST_PROC;
END;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk2uM3/btsHoe2CnvP/nQXe4TOAMggkghXKeswUP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk2uM3/btsHoe2CnvP/nQXe4TOAMggkghXKeswUP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk2uM3/btsHoe2CnvP/nQXe4TOAMggkghXKeswUP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk2uM3%2FbtsHoe2CnvP%2FnQXe4TOAMggkghXKeswUP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;117&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PL/SQL 블록이나 별도의 DB툴에서는 상단과 같이 입력해서 실행하면 정상적으로 출력되는 점을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(필자는 Oracle 19.3 + DataGrip 2023.03 툴을 사용하고 있다.)&lt;/p&gt;
&lt;pre id=&quot;code_1715502002510&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM USER_SOURCE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U2IAb/btsHmsPdKbF/UlM6QvBt84PURonlKhUO81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U2IAb/btsHmsPdKbF/UlM6QvBt84PURonlKhUO81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U2IAb/btsHmsPdKbF/UlM6QvBt84PURonlKhUO81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU2IAb%2FbtsHmsPdKbF%2FUlM6QvBt84PURonlKhUO81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1277&quot; height=&quot;323&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로시저에 대한 전반적인 내용을 확인하기 위해서는 USER_SOURCE라는 데이터 사전을 확인하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1715502250178&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DROP PROCEDURE TEST_PROC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로시저를 삭제할 때는 &lt;b&gt;DROP PROCEDURE [프로시저명]&lt;/b&gt;을 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1715523158510&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE [프로시저명] (
    [파라미터명] [IN | OUT | IN OUT] [자료형] [:= || DEFAULT 기본값],
    [파라미터명] [IN | OUT | IN OUT] [자료형] [:= || DEFAULT 기본값],
    ...
)

IS [또는 AS]
    [선언부]
BEGIN
    [수행 로직]
EXCEPTION
    [예외처리 로직]
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 쿼리문 구조는 파라미터(Parameter)를 사용하는 프로시저의 구조를 보여주고 있다. 이전 프로시저 구조와 다른 점이 있다면 프로시저를 실행하기 위한 값을 입력받는 구간인 파라미터의 존재 여부에서 차이점이 존재한다. 여러 개의 파라미터를 설정할 때는 세미콜론이 아닌 쉼표(,)로 구분하며 값을 입력받는 파라미터의 구조는 &lt;b&gt;[파라미터명] [파라미터 모드] [자료형] [:= 또는 DEFAULT 기본값]&lt;/b&gt;이며 파라미터명과 자료형을 제외한 나머지 두 개는 선택사항이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;파라미터 모드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;IN&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;값을 지정하지 않으면 기본값으로 입력받음 (생략 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;OUT&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;호출 시 값 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;IN OUT&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;호출 시 값을 입력받고 실행 결과에서 값 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 표는 파라미터 모드에 대한 설명을 담고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715757009964&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create OR REPLACE PROCEDURE TEST_PROC_PARAM (
    V_NAME IN VARCHAR2,
    V_GRADE IN NUMBER DEFAULT 2,
    V_AGE IN OUT NUMBER,

    V_RESULT OUT VARCHAR
)

AS
    V_CHECK NUMBER(10) := 0;

BEGIN
    SELECT COUNT(*) INTO V_CHECK
      FROM STUDENT_INFO
     WHERE STU_NAME = V_NAME
       AND STU_GRADE = V_GRADE;

    IF V_CHECK &amp;gt; 0 THEN
        DBMS_OUTPUT.PUT_LINE('해당 학생은 존재합니다.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('해당 학생은 없습니다.');
    END IF;

    V_RESULT := '결과 출력을 마칩니다.';

   DBMS_OUTPUT.PUT_LINE(V_RESULT || V_AGE);
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 프로시저에서 DECALRE 선언부에 IN, OUT, IN OUT 파라미터를 사용한 PL/SQL문이다. IN을 통해 실행에 필요한 값을 입력받도록 구현하였으며 OUT을 통해 실행 후 내부 로직을 거쳐서 출력되는 값을 확인할 수 있다. 그리고 IN OUT을 통해 입력과 출력에 대한 기능을 동시에 사용가능한 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715758379983&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    TEST_OUT VARCHAR2(100);
    AGE_IO NUMBER;
BEGIN
    AGE_IO := 20;
    SCOTT.TEST_PROC_PARAM('홍길동', 2, AGE_IO, TEST_OUT);

    DBMS_OUTPUT.PUT_LINE(TEST_OUT || ' ' || AGE_IO);
END;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkSxgw/btsHp1wAJR3/XnArKUQr2N5ExXzOONb35k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkSxgw/btsHp1wAJR3/XnArKUQr2N5ExXzOONb35k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkSxgw/btsHp1wAJR3/XnArKUQr2N5ExXzOONb35k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkSxgw%2FbtsHp1wAJR3%2FXnArKUQr2N5ExXzOONb35k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;360&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 이전에 확인했던 TEST_PROC_PARAM 프로시저를 실행하기 위한 것이며 프로시저명([파라미터값1], [파라미터값2] ..)을 통해서 작동해야 되며 괄호 안에 선언해둔 파라미터 갯수대로 반드시 맞춰야 한다. 하지만 IN과 다르게 OUT과 IN OUT은 선언부에 [변수명] [자료형]; 방식으로 선언한 뒤 BEGIN에다 괄호 안에 입력해야 한다. 그 중에서 IN OUT은 IN의 기능도 가지고 있기 때문에 BEGIN 문에다 값을 대입해야 한다. 또한 OUT과 IN OUT에 대한 결과를 출력받기 위해서는 프로시저문에다가도 설정할 수 있으나 실행문에서도 DBMS_OUTPUT.PUT_LINE()을 통해서 출력할 수 있다.&lt;/p&gt;</description>
      <category>Database/SQL</category>
      <category>Database</category>
      <category>db</category>
      <category>oracle</category>
      <category>Parameter</category>
      <category>PL/SQL</category>
      <category>procedure</category>
      <category>SQL</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <category>프로시저</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/69</guid>
      <comments>https://untitedblue.tistory.com/entry/SQL-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80-Procedure#entry69comment</comments>
      <pubDate>Wed, 15 May 2024 17:14:31 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] PL/SQL</title>
      <link>https://untitedblue.tistory.com/entry/SQL-PLSQL</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 PL/SQL에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- PL/SQL이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB와 관련된 작업을 수행하는 명령어와 실행 필수 요소를 정의하는 명령어의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;키워드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;필수 유무&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;DECLARE&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;선택&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;선언부이며 실행에 필요한 변수, 상수, 커서 등 선언하는 공간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;BEGIN&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;필수&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;실행부이며 조건문, 반복문, 함수, SELECT, DML 등을 정의하는 공간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;EXCEPTION&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;선택&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;실행 중 발생하는 예외 및 오류를 다루는 공간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 표는 PL/SQL를 다루기 위해서 필요하는 기본적인 블록에 대한 설명을 담고 있다. 선언부와 예외는 선택적으로 다룰 수도 있지만 BEGIN은 필수이다.&lt;/p&gt;
&lt;pre id=&quot;code_1715418287959&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    BEGIN

	-- 한 줄 주석
    /*
    여러 문 주석
    입니다.
    */
    DBMS_OUTPUT.PUT_LINE('This is PL/SQL Printing');
    DBMS_OUTPUT.PUT_LINE(SYSDATE);

    END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxZclh/btsHmt8a3UL/bbqYII2K9SpEuKYC0wklI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxZclh/btsHmt8a3UL/bbqYII2K9SpEuKYC0wklI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxZclh/btsHmt8a3UL/bbqYII2K9SpEuKYC0wklI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxZclh%2FbtsHmt8a3UL%2FbbqYII2K9SpEuKYC0wklI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;282&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 DBMS_OUTPUT.PUT_LINE()을 통해 프로그래밍 언어에서 실습했던 출력문처럼 Console문을 출력할 수 있는 점을 확인할 수 있다. 또한 주석도 작성할 수 있는데 -- 을 통해 한 줄 주석을 작성할 수 있으며 /**/을 통해 여러 줄로 주석 작성할 수도 있다. PL/SQL을 작성할 때는 세미콜론(;)은 출력문과 END문에만 사용해야 한다. PL/SQL문의 작성을 마칠 때는 실행을 위해 반드시 슬래시(/)을 붙여야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1715419742461&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_AGE NUMBER(10) := 26;
    V_NAME VARCHAR2(50) := '홍길동';
    V_COMMENT VARCHAR2(100);

BEGIN
    V_COMMENT := 'HELLO. HAVE A GOOD DAY :)';
    DBMS_OUTPUT.PUT_LINE(V_NAME || '님 (' || V_AGE || ')의 멘트 : ' || V_COMMENT);
    DBMS_OUTPUT.PUT_LINE(SYSDATE);

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3dMn/btsHlu0HXTB/Eo04W1PX81SwehCSvfxM1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3dMn/btsHlu0HXTB/Eo04W1PX81SwehCSvfxM1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3dMn/btsHlu0HXTB/Eo04W1PX81SwehCSvfxM1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3dMn%2FbtsHlu0HXTB%2FEo04W1PX81SwehCSvfxM1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;388&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 DECLARE 선언부를 활용한 PL/SQL문이다. 해당 쿼리문을 실행해보면 선언부에 설정해둔 변수를 기반으로 작성한 출력문이 콘솔창에 출력되는 것을 확인할 수 있다. 이처럼 변수 선언할 때는 &lt;b&gt;[변수명] [자료형] := [값 또는 식]&lt;/b&gt;을 통해 선언 및 활용할 수 있다. 또한 프로그래밍 언어처럼 선언부에 선언만 한 채로 BEGIN문에다 변수에 값 또는 식을 대입시킬 수도 있다.&amp;nbsp;&lt;b&gt;자료형은 NUMBER(), VARCHAR(), VARCHAR2(), DATE, BOOLEAN 총 다섯 가지로 구성&lt;/b&gt;되어있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715420550620&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    VC_NUMBER CONSTANT NUMBER(10) := 10;

BEGIN
    DBMS_OUTPUT.PUT_LINE('VC_NUMBER : ' || VC_NUMBER);

    VC_NUMBER := 20;
    DBMS_OUTPUT.PUT_LINE('VC_NUMBER : ' || VC_NUMBER);

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 &lt;b&gt;CONSTANT&lt;/b&gt;라는 키워드를 사용해서 상수를 선언하고 값을 할당한 쿼리문이다. 해당 쿼리문을 실행하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ORA-06550: 줄 7, 열5:PLS-00363: 'VC_NUMBER' 식은 피할당자로 사용될 수 없습니다, 줄 7, 열5 :PL/SQL: Statement ignored&lt;/b&gt; 라는 오류에 대한 알림이 발생하는 점을 확인할 수 있다. 이와 같은 오류가 발생하는 이유는 &lt;b&gt;상수라는 키워드 특성상 한 번 값을 할당하면 더 이상의 재할당이 안되기 때문&lt;/b&gt;이다. 프로그래밍 언어처럼 상수는 변수와 달리 불변의 특성이 있다. 그렇기 때문에 상단 쿼리문을 실행하면 출력이 되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPvKiI/btsHnVvf3GY/d1GzKM34Kkt8KJkBVssWTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPvKiI/btsHnVvf3GY/d1GzKM34Kkt8KJkBVssWTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPvKiI/btsHnVvf3GY/d1GzKM34Kkt8KJkBVssWTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPvKiI%2FbtsHnVvf3GY%2Fd1GzKM34Kkt8KJkBVssWTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;331&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 문제되는 구간을 주석 처리 후 실행하면 정상적으로 실행되는 점 또한 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715421761004&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    VD_START_VALUE NUMBER(10) DEFAULT 100;

BEGIN
    DBMS_OUTPUT.PUT_LINE('VD_START_VALUE : ' || VD_START_VALUE);

    VD_START_VALUE := 200;
    DBMS_OUTPUT.PUT_LINE('VD_START_VALUE : ' || VD_START_VALUE);

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VHgUO/btsHl0SIew4/yHM20tqH2PAHKtprIqcRaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VHgUO/btsHl0SIew4/yHM20tqH2PAHKtprIqcRaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VHgUO/btsHl0SIew4/yHM20tqH2PAHKtprIqcRaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVHgUO%2FbtsHl0SIew4%2FyHM20tqH2PAHKtprIqcRaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;362&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 &lt;b&gt;DEFALUT&lt;/b&gt;라는 키워드를 사용한 PL/SQL문이다. 다음과 같이 DEFAULT 키워드를 사용해서 변수를 선언하면 &lt;b&gt;별도의 값 또는 식의 대입이 없어도 기본적으로 설정해둔 값이 대입 및 활용가능하도록 설정&lt;/b&gt;할 수 있다. 또한 중간에 별도로 변수 안에 값을 임의로 대입할 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715422031718&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    VNNL_REQUIRED_VALUE VARCHAR2(100) NOT NULL := 'NOT NULL VALUE';

BEGIN
    DBMS_OUTPUT.PUT_LINE('VNNL_REQUIRED_VALUE : ' || VNNL_REQUIRED_VALUE);

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjphli/btsHlK3FGV4/0ixJYhfbgbjZc45m8YkuX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjphli/btsHlK3FGV4/0ixJYhfbgbjZc45m8YkuX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjphli/btsHlK3FGV4/0ixJYhfbgbjZc45m8YkuX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjphli%2FbtsHlK3FGV4%2F0ixJYhfbgbjZc45m8YkuX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;255&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문 &lt;b&gt;NOT NULL&lt;/b&gt; 키워드를 사용하여 &lt;b&gt;변수 안에 반드시 값이 존재하도록 규정&lt;/b&gt;한 쿼리문이다. 실행해보면 이미지처럼 출력문이 정상적으로 출력되는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715422108626&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    VNNL_REQUIRED_VALUE VARCHAR2(100) NOT NULL := 'NOT NULL VALUE';

BEGIN
    VNNL_REQUIRED_VALUE := '';
    DBMS_OUTPUT.PUT_LINE('VD_START_VALUE : ' || VNNL_REQUIRED_VALUE);

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 쿼리문을 실행하면 &lt;b&gt;ORA-06502: PL/SQL: 수치 또는 값 오류&lt;/b&gt; 라는 알림이 발생하면서 쿼리문이 실행되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 오류가 발생하는 이유는 &lt;b&gt;NOT NULL이라는 키워드를 설정해두면 설정해둔 변수 안에는 반드시 값이 있도록 제어되기 때문&lt;/b&gt;이다. 그렇기 때문에 '' 처럼 빈 값이 설정되어있으면 오류가 발생하는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715422518731&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_STU_NAME STUDENT_INFO.STU_NAME%TYPE := '홍길동';

BEGIN
    DBMS_OUTPUT.PUT_LINE('V_STU_NAME : ' || V_STU_NAME);

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sihZG/btsHncxtziU/Hr69WlI8kxBtUexSAaMZu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sihZG/btsHncxtziU/Hr69WlI8kxBtUexSAaMZu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sihZG/btsHncxtziU/Hr69WlI8kxBtUexSAaMZu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsihZG%2FbtsHncxtziU%2FHr69WlI8kxBtUexSAaMZu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;252&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 기존 테이블 내 칼럼이 가지고 있는 자료형을 기반으로 변수를 선언하고 값을 대입할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식은&lt;b&gt; [변수명] [테이블명.칼럼명]%TYPE := [값 또는 식];&lt;/b&gt; 이며 VARCHAR2(), DATE와 같이 스칼라형으로 선언하는 것처럼 PL/SQL문을 작성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715424746510&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_STUDENT STUDENT_INFO%ROWTYPE;

BEGIN
    SELECT * INTO V_STUDENT
      FROM STUDENT_INFO
     WHERE STU_NAME = '홍길동';

    DBMS_OUTPUT.PUT_LINE('V_STUDENT.STU_NUM : ' || V_STUDENT.STU_NUM);
    DBMS_OUTPUT.PUT_LINE('V_STUDENT.STU_NAME : ' || V_STUDENT.STU_NAME);
    DBMS_OUTPUT.PUT_LINE('V_STUDENT.STU_DEPT : ' || V_STUDENT.STU_DEPT);

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/no2kW/btsHlJcBZUu/1W8rALQrLecvrZFmRdMzVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/no2kW/btsHlJcBZUu/1W8rALQrLecvrZFmRdMzVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/no2kW/btsHlJcBZUu/1W8rALQrLecvrZFmRdMzVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fno2kW%2FbtsHlJcBZUu%2F1W8rALQrLecvrZFmRdMzVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;467&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에는 테이블 내 칼럼명이 가지고 있는 자료형을 참조하는 방식으로 변수를 선언했다면 상단 쿼리문에는 테이블 전체를 참조해서 변수를 선언하고 활용할 수 있다. 형식은&lt;b&gt; [변수명] [테이블명]%ROWTYPE&lt;/b&gt;이며 ROWTYPE을 통해 특정 테이블에서 각각의 열 하나가 아닌 행 전체를 참조하는 방식으로 진행된다. 쿼리문을 보면 BEGIN 문 바로 하단에 SELECT문이 있는데 * (또는 칼럼명) 옆에 INTO 키워드와 변수명이 있는데 이는 SELECT 문 실행을 통한 결과를 변수에 대입시키는 역할을 하고 있다. 출력문에다 변수명.칼럼명을 입력 후 실행하면 쿼리문에 대한 결과를 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 조건 제어문&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IF 조건문 : IF-THEN, IF-THEN-ELSE, IF-THEN-ELSIF&lt;/li&gt;
&lt;li&gt;CASE 조건문 : 단순 CASE문, 검색 CASE문&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNRza/btsHnKADyt0/jGlVLjwW5IqfvXhRMiGkY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNRza/btsHnKADyt0/jGlVLjwW5IqfvXhRMiGkY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNRza/btsHnKADyt0/jGlVLjwW5IqfvXhRMiGkY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNRza%2FbtsHnKADyt0%2FjGlVLjwW5IqfvXhRMiGkY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;652&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 이미지는 IF 조건문의 세 가지 종류에 대한 형식을 설명해주고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715427022945&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_STUDENT STUDENT_INFO%ROWTYPE;

BEGIN
    SELECT * INTO V_STUDENT
      FROM STUDENT_INFO
     WHERE STU_NAME = '홍길동';

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.STU_NAME || ' 학생은 ' || V_STUDENT.STU_GRADE || '학년입니다.');
    IF V_STUDENT.STU_GRADE = '1' THEN
        DBMS_OUTPUT.PUT_LINE('신입생');
    ELSIF V_STUDENT.STU_GRADE = '4' THEN
        DBMS_OUTPUT.PUT_LINE('졸업예정자');
    ELSE
        DBMS_OUTPUT.PUT_LINE('일반 재학생');
    END IF;

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 IF-THEN-ELSIF문을 활용해서 작성한 PL/SQL문이다. 해당 쿼리문을 실행해보면 홍길동 학생은 2학년이기 때문에 어느 조건문에도 해당되지 않으므로 ELSE문으로 이동하게 되며 일반 재학생이라고 출력될 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xdzrp/btsHlFAUQgs/MNK6FcH0hpYUGdeJ2WeoqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xdzrp/btsHlFAUQgs/MNK6FcH0hpYUGdeJ2WeoqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xdzrp/btsHlFAUQgs/MNK6FcH0hpYUGdeJ2WeoqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxdzrp%2FbtsHlFAUQgs%2FMNK6FcH0hpYUGdeJ2WeoqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1098&quot; height=&quot;397&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측의 CASE문은 값으로만 진위여부를 판단하는 단순 CASE문이며 우측은 조건식을 통한 진위여부를 판단하는 검색 CASE문이다. 전반적인 구조 내지 형식은 거의 동일하며 달라진 점이 있다면 WHEN과 THEN 사이에 들어가는 것이 단순한 값인지 조건식인지에 대한 차이와 CASE 옆에 비교 기준이 존재하는지에 대한 차이가 존재한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715428049039&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_STUDENT STUDENT_INFO%ROWTYPE;

BEGIN
    SELECT * INTO V_STUDENT
      FROM STUDENT_INFO
     WHERE STU_NAME = '홍길동';

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.STU_NAME || ' 학생은 ' || V_STUDENT.STU_GRADE || '학년입니다.');

    CASE V_STUDENT.STU_GRADE
        WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('신입생입니다.');
        WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('졸업예정자입니다.');
        ELSE DBMS_OUTPUT.PUT_LINE('일반 재학생입니다.');
    END CASE;
    
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 WHEN 옆에 단순 값을 활용해서 작성한 단순 CASE PL/SQL 문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1715428170876&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_STUDENT STUDENT_INFO%ROWTYPE;

BEGIN
    SELECT * INTO V_STUDENT
      FROM STUDENT_INFO
     WHERE STU_NAME = '홍길동';

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.STU_NAME || ' 학생은 ' || V_STUDENT.STU_GRADE || '학년입니다.');

    CASE
        WHEN V_STUDENT.STU_GRADE = 1 THEN DBMS_OUTPUT.PUT_LINE('신입생입니다.');
        WHEN V_STUDENT.STU_GRADE &amp;lt; 4 OR V_STUDENT.STU_GRADE &amp;gt;= 2 THEN DBMS_OUTPUT.PUT_LINE('일반 재학생입니다.');
        ELSE DBMS_OUTPUT.PUT_LINE('졸업예정자입니다.');
    END CASE;

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 쿼리문은 조건식을 활용한 검색 CASE문을 활용한 PL/SQL문이다. 상단 두 개에 대한 출력 결과는 모두 동일하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 반복 제어문 (LOOP)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BASIC LOOP : 기본 반복문&lt;/li&gt;
&lt;li&gt;WHILE LOOP : 조건식에 대한 결과를 기반으로 반복 수행&lt;/li&gt;
&lt;li&gt;FOR LOOP : 반복 횟수를 지정하여 반복 수행&lt;/li&gt;
&lt;li&gt;CUSOR FOR LOOP : 커서를 활용한 반복 수행&lt;/li&gt;
&lt;li&gt;EXIT : 수행 중인 반복 종료&lt;/li&gt;
&lt;li&gt;EXIT-WHEN : 조건식에 만족할 때 반복 종료&lt;/li&gt;
&lt;li&gt;CONTINUE : 수행 중인 반복의 현재 주기 생략&lt;/li&gt;
&lt;li&gt;CONTINUE-WHEN : 조건식에 만족할 때 현재 반복 주기 생략&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RcZWI/btsHngz38ry/bxtuwSkTEv5qNHci5LZS4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RcZWI/btsHngz38ry/bxtuwSkTEv5qNHci5LZS4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RcZWI/btsHngz38ry/bxtuwSkTEv5qNHci5LZS4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRcZWI%2FbtsHngz38ry%2FbxtuwSkTEv5qNHci5LZS4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1297&quot; height=&quot;701&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복 제어문에 대한 전반적인 문법 구조는 상단의 이미지와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1715495144964&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_NUM NUMBER(10) := 0;

BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(V_NUM);
        V_NUM := V_NUM + 1;

        EXIT WHEN V_NUM &amp;gt; 10; -- 반복을 멈추는 시점 설정
    END LOOP;

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mOQPa/btsHmsIq1B8/PiSv0kpCVcgXgqt6pkVyG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mOQPa/btsHmsIq1B8/PiSv0kpCVcgXgqt6pkVyG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mOQPa/btsHmsIq1B8/PiSv0kpCVcgXgqt6pkVyG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmOQPa%2FbtsHmsIq1B8%2FPiSv0kpCVcgXgqt6pkVyG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;342&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 단순 LOOP문을 활용한 PL/SQL문이다. 해당 쿼리문을 실행해보면 이미지처럼 0부터 10까지 반복문이 실행되는 점을 확인할 수 있다. 이때 EXIT WHEN 키워드를 사용해서 반복문을 종료하는 시점을 설정해서 10까지만 반복하고 종료하도록 설정되어있는 점을 확인할 수 있다. IF THEN 문을 사용해서도 반복문의 종료시점을 설정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715495407660&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
    V_NUM NUMBER(10) := 0;

BEGIN
    WHILE V_NUM &amp;lt;= 10 LOOP
        DBMS_OUTPUT.PUT_LINE(V_NUM);
        V_NUM := V_NUM + 1;
    END LOOP;

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 WHILE LOOP를 사용해서 작성한 쿼리문이다. 출력 결과는 상단의 단순 LOOP문과 동일하다. 해당 쿼리문을 살펴보면 WHILE와 LOOP 사이에 조건식을 작성해서 반복문을 구현하는 방식이며 V_NUM &amp;lt;= 10을 통해 V_NUM의 값이 10이 될 때까지 내부 로직을 반복해서 실행하겠다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715496665774&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE

BEGIN
    FOR i IN 0 .. 10 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 FOR LOOP문을 활용해서 반복문을 작성한 PL/SQL문이다. 해당 건의 결과는 상단의 두 개의 쿼리문과 동일하다. 해당 쿼리문을 보면 프로그래밍 언어와 거의 비슷한 구조를 지니고 있으며 0부터 10까지 반복하다가 반복문을 종료하고 있다는 점을 볼 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715496923725&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
BEGIN
    FOR i IN 0 .. 10 LOOP
        CONTINUE WHEN i = 2 OR i = 5;
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;

END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZGjID/btsHoehdAUF/pUI1g9XrKK30y0U5c07faK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZGjID/btsHoehdAUF/pUI1g9XrKK30y0U5c07faK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZGjID/btsHoehdAUF/pUI1g9XrKK30y0U5c07faK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZGjID%2FbtsHoehdAUF%2FpUI1g9XrKK30y0U5c07faK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;277&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 쿼리문은 FOR LOOP안에 CONTINUE WHEN을 활용해서 특정 조건에서 반복 내지 출력을 생략하는 PL/SQL문이다. 쿼리문을 실행해보면 상단 이미지처럼 특정 조건에 달성한 경우에만 출력을 생략하고 그 외에는 그대로 출력해주는 것을 확인할 수 있다. CONTINUE WHEN 뒤에 i = 2 OR i = 5라고 되어있는데 이는 i의 값이 2 또는 5일 때 건너뛴다는 뜻이다.&lt;/p&gt;</description>
      <category>Database/SQL</category>
      <category>Case</category>
      <category>if-then</category>
      <category>It</category>
      <category>loop</category>
      <category>oracle</category>
      <category>PL/SQL</category>
      <category>SQL</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <category>프로그래밍</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/68</guid>
      <comments>https://untitedblue.tistory.com/entry/SQL-PLSQL#entry68comment</comments>
      <pubDate>Sun, 12 May 2024 16:00:25 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 제약 조건</title>
      <link>https://untitedblue.tistory.com/entry/SQL-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 글은 제약조건에 대한 설명입니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;- 제약 조건이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블 내 특정 칼럼에 조건에 부합하지 않는 값을 입력할 수 없도록 하는 조건&lt;/li&gt;
&lt;li&gt;대표적으로 NOT NULL, CHECK, PRIMARY KEY, FORGEIN KEY, UNIQUE가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 제약 조건 정보를 모두 볼 수 있는 테이블&lt;/h3&gt;
&lt;pre id=&quot;code_1714826445728&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM USER_CONSTRAINTS;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5JVDK/btsHcr2wsKa/Q4JDKE42uXqDjPEmz1JIw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5JVDK/btsHcr2wsKa/Q4JDKE42uXqDjPEmz1JIw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5JVDK/btsHcr2wsKa/Q4JDKE42uXqDjPEmz1JIw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5JVDK%2FbtsHcr2wsKa%2FQ4JDKE42uXqDjPEmz1JIw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1551&quot; height=&quot;595&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USER_CONSTRAINTS 테이블은 현재 로그인하고 있는 계정에 존재하는 모든 테이블의 제약 조건을 보여주고 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 132px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;칼럼명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;OWNER&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;제약 조건의 소유자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;CONSTRAINT_NAME&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;제약 조건의 명칭 (별도의 지정이 없으면 임의값 배정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 55px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 55px;&quot;&gt;CONSTRAINT_TYPE&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 55px;&quot;&gt;제약 조건 타입&lt;br /&gt;(C : CHECK, NOT NULL, U : UNIQUE, &lt;br /&gt;P : Primary Key, R : Foreign Key)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;TABLE_NAME&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;제약 조건이 명시되어있는 테이블명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccHd2X/btsHbmnYJIk/UydngJypz2e0MrEk3cqwKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccHd2X/btsHbmnYJIk/UydngJypz2e0MrEk3cqwKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccHd2X/btsHbmnYJIk/UydngJypz2e0MrEk3cqwKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccHd2X%2FbtsHbmnYJIk%2FUydngJypz2e0MrEk3cqwKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;513&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 이미지는 테이블 생성하는 쿼리문이며 제약 조건의 종류와 제약 조건의 명칭을 지정할 수 있다는 점을 확인할 수 있다. 학번인 STU_NUM은 기본키로 설정하였으며 성별 정보를 담는 STU_GENDER는 CHECK를 통해 남자와 여자 두 개의 데이터만 담을 수 있도록 제한한 점을 확인할 수 있으며 나머지는 NOT NULL을 통해 빈 값을 허용하지 않도록 두었다.&lt;/p&gt;
&lt;pre id=&quot;code_1714915046480&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;STU_NAME VARCHAR2(300) NOT NULL CONSTRAINT STU_INFO_NAME_NN&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 &lt;b&gt;[칼럼명] [데이터타입] [제약조건] CONSTRAINT [제약조건명]&lt;/b&gt;을 통해 테이블 생성과 동시에 제약 조건을 설정할 수 있다. 데이터 생성 이후에 USER_CONSTRAINTS 테이블 뒤에 TABLE_NAME = '[테이블명]'을 붙이고 쿼리문을 실행하면 생성한 테이블에 대한 모든 제약 조건에 대한 정보를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1714916036152&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE STUDENT_INFO 
     MODIFY (STU_DEPT NULL);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 테이블 내의 칼럼에 대해서 제약 조건을 변경하는 쿼리문이다. 제약 조건을 기존 NOT NULL에서 NULL로 변경하라는 뜻을 가지고 있다. 해당 쿼리문을 실행하면 제약 조건을 무리없이 바꿀 수 있지만 반대로 NULL에서 NOT NULL로 변경하려고 할 때는 다를 수 있다. 왜냐하면 기존에 테이블에 저장되어 있는 데이터 중에 NULL값이 하나라도 있다면 변경하려는 NOT NULL이라는 제약 조건에 위배된다는 점에서 변경이 안되는 경우가 존재하기 때문이다. 그렇기 때문에 제약 조건은 가급적이면 처음 테이블을 생성할 때 계획하고 지정하는 것을 권장한다. 물론 기존 NULL이었던 데이터를 빈 값이 없도록 수정한 후에 제약 조건을 수정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1714916755947&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE STUDENT_INFO RENAME CONSTRAINT STU_INFO_ACA_NN TO STU_INFO_STATUS_NN;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문은 테이블 내 기존 제약조건명을 다른 이름으로 새롭게 수정하는 역할을 담당하고 있다. 쿼리문 형식은 &lt;b&gt;ALTER TABLE [테이블명] RENAME CONSTRAINT [기존명칭] TO [새명칭]&lt;/b&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cppZuC/btsHcTLwPJ5/QH87f0cMA4aWnqxpmoDUyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cppZuC/btsHcTLwPJ5/QH87f0cMA4aWnqxpmoDUyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cppZuC/btsHcTLwPJ5/QH87f0cMA4aWnqxpmoDUyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcppZuC%2FbtsHcTLwPJ5%2FQH87f0cMA4aWnqxpmoDUyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;241&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 쿼리문 실행 후 USER_ &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;CONSTRAINTS 테이블을 조회하면 정상적으로 명칭이 변경된 점을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714917065045&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE STUDENT_INFO DROP CONSTRAINT STU_INFO_STATUS_NN;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 쿼리문을 통해 기존에 지정되어 있던 테이블 내 제약조건을 삭제할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 빈 값은 허용하지 않는다. NOT NULL&lt;/h3&gt;
&lt;pre id=&quot;code_1714917368943&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO STUDENT_INFO VALUES ('이땡땡', '20240101', '1', '예술디자인대학', '서양화과', NULL ,'남자');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단에서 언급했던 STUDENT_INFO 테이블에 STU_ACA이라는 칼럼에 값을 넣지 않은 상태로 상단 쿼리문을 실행하면 &lt;b&gt;ORA-01400: NULL을 (&quot;SCOTT&quot;.&quot;STUDENT_INFO&quot;.&quot;STU_ACA&quot;) 안에 삽입할 수 없습니다&amp;nbsp;&lt;/b&gt;라는 알림창과 함께 테이블에 데이터가 입력되지 않는 점을 확인할 수 있다. 왜냐하면 STU_ACA는 NOT NULL이라는 제약 조건이 존재하기 때문에 빈 값을 허용하지 않기 때문이다. 이렇듯 NOT NULL은 빈 값이 삽입되는 것을 허용하지 않는다는 점을 알 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 빈 값은 허용해도 중복값은 허용하지 않는다. UNIQUE&lt;/h3&gt;
&lt;pre id=&quot;code_1714917676097&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM TABLE_UNIQUE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HsyyU/btsHcl2Ca54/0tqHh7lk61UCKRGanA7GW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HsyyU/btsHcl2Ca54/0tqHh7lk61UCKRGanA7GW1/img.png&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;213&quot; data-is-animation=&quot;false&quot; style=&quot;width: 69.2317%; margin-right: 10px;&quot; data-widthpercent=&quot;70.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HsyyU/btsHcl2Ca54/0tqHh7lk61UCKRGanA7GW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHsyyU%2FbtsHcl2Ca54%2F0tqHh7lk61UCKRGanA7GW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTQzhO/btsHbjELbpq/9abZXvDpshXtccwVIvBxk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTQzhO/btsHbjELbpq/9abZXvDpshXtccwVIvBxk1/img.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;360&quot; data-is-animation=&quot;false&quot; style=&quot;width: 29.6055%;&quot; data-widthpercent=&quot;29.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTQzhO/btsHbjELbpq/9abZXvDpshXtccwVIvBxk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTQzhO%2FbtsHbjELbpq%2F9abZXvDpshXtccwVIvBxk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 TABLE_UNIQUE 테이블의 스크립트를 보면 LOGIN_ID라는 칼럼의 제약 조건이 UNIQUE로 설정되어 있는 점을 확인할 수 있다. UNIQUE는 NULL은 값 자체가 없기 때문에 여러 개 있어도 무방하나 데이터의 중복을 허용하지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714917910961&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO TABLE_UNIQUE VALUES ('TEST_ID_02', '1111', '02-1111-1111');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문을 실행하면 &lt;b&gt;ORA-00001: 무결성 제약 조건(SCOTT.SYS_C007645)에 위배됩니다&lt;/b&gt; 라는 알림이 발생하는 점을 확인할 수 있는데 이러한 알림이 발생하는 이유는 중복된 값을 허용하지 않는 제약 조건을 위배했기 때문이다. 이렇듯 UNIQUE 제약조건은 중복된 데이터를 허용하지 않는다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 지정해둔 값만 저장할 수 있다. Check&lt;/h3&gt;
&lt;pre id=&quot;code_1714994461912&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO STUDENT_INFO VALUES ('김땡땡', '20240101', '1', '인문대학', '문헌정보학과', '재학', '남성');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 쿼리문을 입력 후 실행하면 &lt;b&gt;ORA-02290: 체크 제약조건(SCOTT.STU_INFO_GENDER_CK)이 위배되었습니다&lt;/b&gt; 라는 알림을 확인할 수 있을 것이다. 이러한 알림이 발생한 이유는 STU_GENDER라는 칼럼에 CHECK 라는 제약 조건이 있는데 여기에는 남자 또는 여자라는 값만 들어오는 것을 허가하고 그 외 값은 삽입되지 않도록 제한되어있기 때문이다.이렇게 &lt;b&gt;지정된 값 외에 다른 값들은 삽입되지 않도록 규정하는 제약 조건&lt;/b&gt;을 CHECK라고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- NOT NULL + UNIQUE = Primary Key&lt;/h3&gt;
&lt;pre id=&quot;code_1714922967247&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'TABLE_PK';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QRSUf/btsHcatsM9p/ObbCxUFFpZbqOxW8SOOkN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QRSUf/btsHcatsM9p/ObbCxUFFpZbqOxW8SOOkN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QRSUf/btsHcatsM9p/ObbCxUFFpZbqOxW8SOOkN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQRSUf%2FbtsHcatsM9p%2FObbCxUFFpZbqOxW8SOOkN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1412&quot; height=&quot;95&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TABLE_PK라는 테이블의 제약 조건을 보면 다음과 같이 P 라는 타입이 있는 점을 통해 내부에 기본키가 지정되어 있는 점을 확인할 수 있다. 기본키는 &lt;b&gt;일종의 고유번호로서 유일성과 최소성을 가졌다는 점이 특징이다. NULL값이어도 안되며 기존 데이터와 중복되서도 안된다는 뜻&lt;/b&gt;이다.&lt;/p&gt;
&lt;pre id=&quot;code_1714923323035&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO TABLE_PK VALUES ('TEST_ID_02', 'PWD02', '010-1111-1111');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 쿼리문을 실행하면 &lt;b&gt;ORA-00001: 무결성 제약 조건(SCOTT.SYS_C007650)에 위배됩니다&lt;/b&gt; 라는 알림이 발생하는 점을 확인할 수 있다. 해당 알림이 발생하는 이유는 중복 데이터라는 점에서 제약 조건을 위배했기 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1714923452363&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO TABLE_PK VALUES (NULL, 'PWD02', '010-1111-1111');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문을 실행하면 &lt;b&gt;NULL을 (&quot;SCOTT&quot;.&quot;TABLE_PK&quot;.&quot;LOGIN_ID&quot;) 안에 삽입할 수 없습니다&lt;/b&gt; 라는 알림이 발생하는데 이는 빈 값이라는 점에서 제약 조건을 위배했기 때문에 데이터가 들어가지 않는다는 점을 확인할 수 있으며 상단의 두 개의 쿼리문을 통해 TABLE_PK 내 LOGIN_ID라는 칼럼이 기본키라는 점을 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 다른 테이블을 참조하고 연결하는 Foreign Key&lt;/h3&gt;
&lt;pre id=&quot;code_1714927598448&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('DEPT_FK', 'EMP_FK');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4hU5Q/btsHcQuwZBF/WwzttNbTfiAORyDK9JIW31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4hU5Q/btsHcQuwZBF/WwzttNbTfiAORyDK9JIW31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4hU5Q/btsHcQuwZBF/WwzttNbTfiAORyDK9JIW31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4hU5Q%2FbtsHcQuwZBF%2FWwzttNbTfiAORyDK9JIW31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1630&quot; height=&quot;130&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외래키는 &lt;b&gt;서로 다른 테이블과의 관계를 정의할 때 사용하는 제약조건이며 특정 테이블의 기본키를 다른 테이블의 특정 칼럼에서 본인들의 테이블을 다룰 때 참조하겠다는 의미&lt;/b&gt;를 담고 있다. 상단의 쿼리문을 실행해보면 EMP_FK와 DEPT_FK 테이블의 제약 조건에 대한 정보를 확인할 수 있는데 이때 CONSTRAINT_TYPE와 R_CONSTRAINT_NAME이라는 칼럼을 주목해보자. &lt;b&gt;CONSTRAINT_TYPE이 R인 점을 봐서 외래키라는 점을 확인할 수 있으며 DEPTFK_DEPTNO_PK가 DEPT_FK 테이블의 기본키라는 점&lt;/b&gt;을 보면 두 테이블 간의 연결 관계가 존재한다는 점과 EMP_FK는 DEPT_FK를 참조하고 있다는 점을 알 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1714929359292&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM EMP_FK;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BJRZJ/btsHcn0sc8y/pHLBbMPxbgoM6mmuuuMQv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BJRZJ/btsHcn0sc8y/pHLBbMPxbgoM6mmuuuMQv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BJRZJ/btsHcn0sc8y/pHLBbMPxbgoM6mmuuuMQv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBJRZJ%2FbtsHcn0sc8y%2FpHLBbMPxbgoM6mmuuuMQv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;66&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1714929407956&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM DEPT_FK;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ts9s4/btsHdt0ckGY/4T9OT7TKGsj3Yx7CL0Dphk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ts9s4/btsHdt0ckGY/4T9OT7TKGsj3Yx7CL0Dphk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ts9s4/btsHdt0ckGY/4T9OT7TKGsj3Yx7CL0Dphk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTs9s4%2FbtsHdt0ckGY%2F4T9OT7TKGsj3Yx7CL0Dphk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;67&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 두 개의 테이블을 봤을 때 공통적인 칼럼 DEPTNO를 확인할 수 있으며 또한 참조관계를 보면 EMP_FK에서 DEPTNO 칼럼을 추가할 때는 무조건 DEPT_FK 테이블을 참조하도록 되어있다. 이를 통해 EMP_FK 테이블에서는 DEPT_FK 내 DEPTNO에 저장되어 있는 값만을 저장할 수 있으며 DEPT_FK에 없는 데이터는 EMP_FK에서 저장할 수 없다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1714929684157&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO EMP_FK VALUES ('1234', 'BLUE', 'CLERK', '5678', SYSDATE, 2800, NULL, 20);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 쿼리문을 실행해보면 &lt;b&gt;ORA-02291: 무결성 제약조건(SCOTT.EMPFK_DEPTNO_FK)이 위배되었습니다- 부모 키가 없습니다&lt;/b&gt; 라는 알림을 확인할 수 있는데 이는 참조되고 있는 테이블 내에 해당되는 데이터가 없기 때문에 발생한 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1714929788289&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO EMP_FK VALUES ('1234', 'BLUE', 'CLERK', '5678', SYSDATE, 2800, NULL, 10);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM4u60/btsHcTdJsx1/A4dCMLIdOY0slCBrRk5451/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM4u60/btsHcTdJsx1/A4dCMLIdOY0slCBrRk5451/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM4u60/btsHcTdJsx1/A4dCMLIdOY0slCBrRk5451/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM4u60%2FbtsHcTdJsx1%2FA4dCMLIdOY0slCBrRk5451%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;96&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단의 쿼리문 같이 DEPT_FK에 있는 데이터를 확인해서 실행하면 상단 이미지처럼 정상적으로 데이터가 입력된 점을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2K6tk/btsHctzKFb6/14XOmGXAOtWMoMGzZKM7QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2K6tk/btsHctzKFb6/14XOmGXAOtWMoMGzZKM7QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2K6tk/btsHctzKFb6/14XOmGXAOtWMoMGzZKM7QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2K6tk%2FbtsHctzKFb6%2F14XOmGXAOtWMoMGzZKM7QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;447&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1714996981611&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CONSTRAINT EMPFK_DEPTNO_FK REFERENCES DEPT_FK (DEPTNO)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 &lt;b&gt;CONSTRAINT [제약조건명] REFERENCES [참조 대상 테이블] ([참조 칼럼])&lt;/b&gt;을 통해 테이블을 생성할 때 참조할 테이블을 바탕으로 외래키를 설정할 수 있는 점 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0oZmX/btsHcrBWPTp/K1LEk9u9FKH4mhPEc5KBD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0oZmX/btsHcrBWPTp/K1LEk9u9FKH4mhPEc5KBD0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;66&quot; data-filename=&quot;[SQL]EMP_FK.png&quot; style=&quot;width: 72.7348%; margin-right: 10px;&quot; data-widthpercent=&quot;73.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0oZmX/btsHcrBWPTp/K1LEk9u9FKH4mhPEc5KBD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0oZmX%2FbtsHcrBWPTp%2FK1LEk9u9FKH4mhPEc5KBD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P0kFk/btsHccE3QpQ/j59EtWkVheNPKMeRoBeaUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P0kFk/btsHccE3QpQ/j59EtWkVheNPKMeRoBeaUK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;67&quot; data-filename=&quot;[SQL]DEPT_FK.png&quot; data-widthpercent=&quot;26.41&quot; style=&quot;width: 26.1025%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P0kFk/btsHccE3QpQ/j59EtWkVheNPKMeRoBeaUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP0kFk%2FbtsHccE3QpQ%2Fj59EtWkVheNPKMeRoBeaUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1714997997399&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELETE FROM DEPT_FK WHERE DEPTNO = '10';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 두 개의 테이블은 참조 관계를 가지고 있는데 부모 테이블인 DEPT_FK에 있는 값을 자식 테이블인 EMP_FK에서 참조해서 사용하고 있는 상태이다. 이러한 상황에서 상단 쿼리문을 실행하면 &lt;b&gt;ORA-02292: 무결성 제약조건(SCOTT.EMPFK_DEPTNO_FK)이 위배되었습니다- 자식 레코드가 발견되었습니다&lt;/b&gt; 이라는 알림이 발생하는 것을 볼 수 있다. 참조 관계의 테이블 사이에서 자식 테이블이 부모 테이블의 데이터를 참조한 건이 하나라도 있으면 삭제할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고 삭제해야된다고 하면 &lt;b&gt;자식 테이블인 EMP_FK에서의 참조하고 있는 행에 대해서 데이터를 수정 또는 삭제&lt;/b&gt;하거나 &lt;b&gt;부모 테이블 내 데이터를 제거하면서 참조하고 있는 자식 테이블의 데이터도 함께 지워야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후자의 방법을 사용하려면 하단의 방법을 사용해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CONSTRAINT [제약조건명] REFERENCES [참조 대상 테이블]([참조 칼럼]) ON DELETE CASCADE&lt;/li&gt;
&lt;li&gt;CONSTRAINT [제약조건명] REFERENCES [참조 대상 테이블]([참조 칼럼]) ON DELETE SET NULL&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째부터 보면 &lt;b&gt;부모 테이블에서 데이터 삭제 시 해당 값을 참조하고 있는 자식 테이블의 데이터도 함께 삭제되도록 설정&lt;/b&gt;하는 것이며 두 번째는 &lt;b&gt;부모 테이블 데이터 삭제 시 참조하고 있는 자식 테이블의 데이터는 NULL값으로 변경&lt;/b&gt;하도록 설정하는 것이다. 데이터를 최대한 보존하는 방향으로 가야되면 두 번째 방법을 사용하는 것이 좋다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 빈 값이면 기본 값으로 자동 삽입한다. Default&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[SQL]TABLE_DEFAULT.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIOWE7/btsHdvKEV4i/V87LERNeazq8FWwsrrcmYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIOWE7/btsHdvKEV4i/V87LERNeazq8FWwsrrcmYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIOWE7/btsHdvKEV4i/V87LERNeazq8FWwsrrcmYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIOWE7%2FbtsHdvKEV4i%2FV87LERNeazq8FWwsrrcmYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;296&quot; data-filename=&quot;[SQL]TABLE_DEFAULT.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 DEFAULT 제약 조건인데 상단의 쿼리문처럼 뒤에 &lt;b&gt;DEFAULT [기본값]&lt;/b&gt;을 통해 특정 칼럼에 별도로 값을 지정하지 않으면 설정해둔 값이 자동으로 삽입될 수 있도록 설정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1714999004637&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO TABLE_DEFAULT (LOGIN_ID, TEL) VALUES ('TEST_ID2', '010-1234-5678');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/behhhM/btsHdeozA2U/tlKtasS08xWf2Vru4kl4OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/behhhM/btsHdeozA2U/tlKtasS08xWf2Vru4kl4OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/behhhM/btsHdeozA2U/tlKtasS08xWf2Vru4kl4OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbehhhM%2FbtsHdeozA2U%2FtlKtasS08xWf2Vru4kl4OK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;117&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 LOGIN_PWD에 아무런 값없이 INSERT문을 실행하면 오류 발생없이 기본값으로 설정해둔 값이 정상적으로 들어가있는 점을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Database/SQL</category>
      <category>CHECK</category>
      <category>Constraints</category>
      <category>Database</category>
      <category>fk</category>
      <category>not null</category>
      <category>oracle</category>
      <category>PK</category>
      <category>SQL</category>
      <category>데이터베이스</category>
      <category>제약조건</category>
      <author>Untitled_Blue</author>
      <guid isPermaLink="true">https://untitedblue.tistory.com/67</guid>
      <comments>https://untitedblue.tistory.com/entry/SQL-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4#entry67comment</comments>
      <pubDate>Mon, 6 May 2024 02:25:50 +0900</pubDate>
    </item>
  </channel>
</rss>