<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>레몬팡</title>
    <link>https://lemonpang777.tistory.com/</link>
    <description>lemonpang777 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 1 Jun 2026 22:06:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>레몬팡777</managingEditor>
    <item>
      <title>JAVA 풀스택 45일차 - Server (JSP MVC)</title>
      <link>https://lemonpang777.tistory.com/46</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JSP MVC&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 구조&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1780042822813&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;View JSP
&amp;darr;
logincontroller.jsp
&amp;darr;
DAO
&amp;darr;
DB
&amp;darr;
logincontroller.jsp
&amp;darr;
View JSP 또는 result.jsp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;파일/쿨래스&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View&lt;/td&gt;
&lt;td&gt;index.jsp, adminmain.jsp, usermain.jsp, userinfo.jsp, userlistall.jsp&lt;/td&gt;
&lt;td&gt;화면 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controller&lt;/td&gt;
&lt;td&gt;logincontroller.jsp&lt;/td&gt;
&lt;td&gt;요청을 받아 command에 따라 기능 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;MyMemberDao, MyMemberDto, DB&lt;/td&gt;
&lt;td&gt;DB 처리와 회원 데이터 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.&amp;nbsp; command 값으로 기능 구분&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;logincontroller.jsp는 command 값을 보고 어떤 기능을 실행할지 결정한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043024042&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String command = request.getParameter(&quot;command&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;command&lt;/td&gt;
&lt;td&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;login&lt;/td&gt;
&lt;td&gt;로그인 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;logout&lt;/td&gt;
&lt;td&gt;로그아웃 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userlist&lt;/td&gt;
&lt;td&gt;회원 전체 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userinfo&lt;/td&gt;
&lt;td&gt;내 정보 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updateform&lt;/td&gt;
&lt;td&gt;내 정보 수정 화면 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updateuser&lt;/td&gt;
&lt;td&gt;내 정보 수정 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deleteuser&lt;/td&gt;
&lt;td&gt;회원 탈퇴 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updateroleform&lt;/td&gt;
&lt;td&gt;회원 등급 변경 화면 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updaterole&lt;/td&gt;
&lt;td&gt;회원 등급 변경 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 로그인 화면&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1 index.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1797&quot; data-start=&quot;1775&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;index.jsp는 로그인 화면이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780042957882&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;logincontroller.jsp&quot; method=&quot;post&quot;&amp;gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;command&quot; value=&quot;login&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; name=&quot;pw&quot;&amp;gt;
    &amp;lt;input type=&quot;submit&quot; value=&quot;login&quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-custom-highlighting-behavior=&quot;boundary&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 사용자가 입력한 아이디와 비밀번호를 logincontroller.jsp로 전송한다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hidden input은 화면에는 보이지 않지만, Controller에게 로그인 기능을 실행하라고 알려준다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 로그인 처리&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1 Controller에서 id, pw 받기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 로그인 버튼을 누르면 logincontroller.jsp에서 값을 받는다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043115648&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String id = request.getParameter(&quot;id&quot;);
String pw = request.getParameter(&quot;pw&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- request.getParameter()는 form에서 전달된 값을 꺼낼 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1780043139813&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;index.jsp form 입력
&amp;darr;
logincontroller.jsp
&amp;darr;
id, pw 받기&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-2 DAO login 실행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Controller는 받은 id, pw를 DAO로 전달한다 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043164662&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyMemberDto dto = dao.login(id, pw);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAO의 login() 메서드는 DB에서 아이디, 비밀번호, 가입 여부를 확인&lt;/p&gt;
&lt;pre id=&quot;code_1780043188038&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql =
&quot; SELECT * FROM MYMEMBER &quot; +
&quot; WHERE MYID=? AND MYPW=? AND MYENABLED=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아이디와 비밀번호가 일치하고, MYENABLED가 &quot;Y&quot;인 회원만 조회한다 / 탈퇴하지 않은 정상 회원만 로그인 할 수 있다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. MyMemberDto&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; MyMemberDto는 회원 한 명의 정보를 저장하는 객체이다 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043253496&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int myno;
private String myid;
private String mypw;
private String myname;
private String myaddr;
private String myphone;
private String myemail;
private String myenabled;
private String myrole;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로그인 성공 시 DB에서 조회한 회원 정보가 MyMemberDto 객체에 저장&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 로그인 성공 처리&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1 로그인 성공 판단&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780043313542&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(dto.getMyid() != null) {
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dto.getMyid()가 null이 아니라면 DB에서 일치하는 회원을 찾았다는 뜻&lt;/p&gt;
&lt;pre id=&quot;code_1780043331114&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;아이디 / 비밀번호 / 가입 여부 조건 일치
&amp;darr;
로그인 성공&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2 session에 로그인 정보 저장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 로그인 성공 시 회원 정보를 session에 저장한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043360176&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;session.setAttribute(&quot;dto&quot;, dto);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로그인한 회원 정보를 dto라는 이름으로 session에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;session에 저장하면 다른 JSP에서도 로그인한 사용자 정보를 사용할 수 있다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-3 session 유지 시간 설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780043396179&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;session.setMaxInactiveInterval(60*60);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- session 유지 시간(로그인 정보 유지 시간)을 60*60(s) 동안 진행한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. Session&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Session은 서버가 사용자별로 정보를 저장하는 공간이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043464527&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;로그인 성공
&amp;darr;
session에 사용자 정보 저장
&amp;darr;
다른 JSP에서도 로그인 상태 확인 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 권한별 페이지 이동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 로그인 성공 후 회원 등급에 따라 이동하는 페이지가 달라진다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043516338&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(dto.getMyrole().equals(&quot;ADMIN&quot;)) {
    response.sendRedirect(&quot;adminmain.jsp&quot;);
} else if(dto.getMyrole().equals(&quot;USER&quot;)) {
    response.sendRedirect(&quot;usermain.jsp&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;등급&lt;/td&gt;
&lt;td&gt;이동페이지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADMIN&lt;/td&gt;
&lt;td&gt;adminmain.jsp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USER&lt;/td&gt;
&lt;td&gt;usermain.jsp&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. 관리자 메인 페이지&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-1 adminmain.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; adminmain.jsp는 관리자 로그인 후 이동하는 메인 화면이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043609017&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyMemberDto dto = (MyMemberDto)session.getAttribute(&quot;dto&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- session에서 로그인 정보를 꺼낸&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-2 로그인하지 않은 사용자 막기&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780043631593&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(dto == null) {
    pageContext.forward(&quot;index.jsp&quot;);
    return;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- session에 dto가 없으면 로그인하지 않은 사용자이다.&lt;/p&gt;
&lt;pre id=&quot;code_1780043653852&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;session에 dto 없음
&amp;darr;
로그인하지 않음
&amp;darr;
index.jsp로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-3 관리자 정보 출력&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780043681009&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;span&amp;gt;&amp;lt;%=dto.getMyname() %&amp;gt;님 환영합니다.(등급: &amp;lt;%=dto.getMyrole() %&amp;gt;)&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JSP 표현식 &amp;lt;%= %&amp;gt;을 사용해서 로그인한 관리자의 이름과 등급을 화면에 출력&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. 사용자 메인 페이지&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10-1 usermain.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; usermain.jsp는 일반 회원이 로그인 후 이동하는 메인 화면이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043735438&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
	MyMemberDto dto = (MyMemberDto)session.getAttribute(&quot;dto&quot;);
	if(dto == null){
		pageContext.forward(&quot;index.jsp&quot;);
		return;
	}
%&amp;gt;

&amp;lt;span&amp;gt;&amp;lt;%=dto.getMyname() %&amp;gt;님 환영합니다.(등급: &amp;lt;%=dto.getMyrole() %&amp;gt;)&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- session에 로그인 정보가 있다면 사용자 이름과 등급을 출력&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;11. 로그아웃 기능&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;11-1 로그아웃 요청&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 관리자 메인과 사용자 메인에는 로그아웃 버튼이 있다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043946786&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onclick=&quot;location.href='logincontroller.jsp?command=logout'&quot;&amp;gt;로그아웃&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버튼 터치 시 Controller로 로그아웃 요청을 보낸&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;11-2 session.invalidate()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Controller에서 로그아웃 요청을 받으면 session을 삭제한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780043980188&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (command.equals(&quot;logout&quot;)){
		session.invalidate();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 session에 저장된 정보를 모두 삭제&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;11-3 로그아웃 결과 처리&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780044124222&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;request.setAttribute(&quot;msg&quot;, &quot;로그아웃 완료&quot;);
request.setAttribute(&quot;url&quot;, &quot;index.jsp&quot;);
pageContext.forward(&quot;result.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로그아웃 후 result.jsp로 이동해서 메시지를 출력하고, 확인 버튼을 누르면 다시 로그인 페이지로 이동한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;12. result.jsp&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;result.jsp는 공통 결과 페이지이다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 로그인 실패, 로그아웃 완료, 내 정보 수정, 회원 탈퇴, 등급 변경 결과를 출력할 때 사용한다 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780044162993&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String msg = (String)request.getAttribute(&quot;msg&quot;);
String url = (String)request.getAttribute(&quot;url&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller에서 저장한 메시지와 이동 주소를 꺼낸다&lt;/p&gt;
&lt;pre id=&quot;code_1780044194520&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;&amp;lt;%=msg %&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;button onclick=&quot;location.href='&amp;lt;%=url%&amp;gt;'&quot;&amp;gt;확인&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;13. 관리자 회원 전체 조회&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;13-1 adminmain.jsp 요청&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; adminmain.jsp에는 회원 전체 조회 링크가 있다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780044277125&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;logincontroller.jsp?command=userlist&quot;&amp;gt;회원 정보 조회(all)&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller로 회원 전체 조회 요청을 보낸다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;13-2 Controller에서 회원 목록 조회&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780044296973&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;MyMemberDto&amp;gt; list = dao.selectAll();

request.setAttribute(&quot;list&quot;, list);
pageContext.forward(&quot;userlistall.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller는 DAO를 통해 전체 회원 목록을 조회하고, 그 결과를 list라는 이름으로 request에 저장한 뒤 userlistall.jsp로 forward한다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;13-3 DAO selectAll()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DAO의 selectAll()은 MYMEMBER 테이블의 전체 회원을 조회한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780044344230&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; SELECT * FROM MYMEMBER ORDER BY MYNO DESC &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;14. userlistall.jsp&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;userlistall.jsp는 관리자용 회원 전체 조회 화면이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780044482611&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyMemberDto dto = (MyMemberDto)session.getAttribute(&quot;dto&quot;);

if(dto == null) {
    pageContext.forward(&quot;index.jsp&quot;);
    return;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- session에 로그인 정보가 없으면 로그인 페이지로 보낸다&lt;/p&gt;
&lt;pre id=&quot;code_1780044505780&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;MyMemberDto&amp;gt; list =
    (List&amp;lt;MyMemberDto&amp;gt;)request.getAttribute(&quot;list&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&lt;/b&gt; Controller에서 넘긴 회원 목록을 꺼낸다&lt;/p&gt;
&lt;pre id=&quot;code_1780044536283&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(MyMemberDto m : list) {
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반복문을 통해 회원 정보 출력&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;15. 마이페이지&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;15-1 내 정보 조회 요청&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 사용자 메인에서 내 정보 보기를 누르면 Controller로 이동한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780044612208&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;logincontroller.jsp?command=userinfo&amp;amp;myno=&amp;lt;%=dto.getMyno() %&amp;gt;&quot;&amp;gt;내정보 보기&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller에게 현재 로그인한 사용자의 정보를 조회해 달라고 요청&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;16-2 Controller에서 selectUser 실행&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780044723405&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
MyMemberDto dto = dao.selectUser(myno);

request.setAttribute(&quot;dto&quot;, dto);
pageContext.forward(&quot;userinfo.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAO의 selectUser()는 회원 번호를 기준으로 회원 한 명의 정보를 조회한다&lt;/p&gt;
&lt;pre id=&quot;code_1780044731585&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;myno 받기
&amp;darr;
dao.selectUser(myno)
&amp;darr;
request에 dto 저장
&amp;darr;
userinfo.jsp로 forward&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;15-3 userinfo.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;userinfo.jsp는 마이페이지 화면이다&lt;/p&gt;
&lt;pre id=&quot;code_1780044785085&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyMemberDto info = (MyMemberDto)request.getAttribute(&quot;dto&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller에서 넘긴 회원 정보를 꺼낸다&lt;/p&gt;
&lt;pre id=&quot;code_1780044808511&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%=info.getMyid() %&amp;gt;
&amp;lt;%=info.getMyname() %&amp;gt;
&amp;lt;%=info.getMyaddr() %&amp;gt;
&amp;lt;%=info.getMyphone() %&amp;gt;
&amp;lt;%=info.getMyemail() %&amp;gt;
&amp;lt;%=info.getMyrole() %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JSP 표현식으로 회원 정보를 출력&lt;/p&gt;
&lt;pre id=&quot;code_1780044834664&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; onclick=&quot;updateUser(&amp;lt;%=info.getMyno()%&amp;gt;)&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;탈퇴&quot; onclick=&quot;deleteUser(&amp;lt;%=info.getMyno()%&amp;gt;)&quot;&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;목록&quot; onclick=&quot;location.href='usermain.jsp'&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마이페이지에 수정, 탈퇴, 목록 버튼이 있다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;16. 내 정보 수정 기능&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;16-1 수정 화면 이동&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 마이페이지에서 수정 버튼을 누르면 JavaScript 함수가 실행된다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780044938233&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function updateUser(myno){
    let con = window.confirm(&quot;회원 정보 수정을 하시겠습니까?&quot;);
    if(con){
        location.href=&quot;logincontroller.jsp?command=updateform&amp;amp;myno=&quot;+myno;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 확인 버튼을 누르면 Controller로 이동&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;16-2 Controller에서 기존 정보 조회&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780044966533&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
MyMemberDto dto = dao.selectUser(myno);

request.setAttribute(&quot;dto&quot;, dto);
pageContext.forward(&quot;updateuser.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 회원 정보를 조회해서 updateuser.jsp로 넘긴다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;16-3 updateuser.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; updateuser.jsp는 내 정보 수정 화면이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045027145&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyMemberDto dto = (MyMemberDto)request.getAttribute(&quot;dto&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780045083610&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; name=&quot;myaddr&quot; value=&quot;&amp;lt;%=dto.getMyaddr() %&amp;gt;&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;myphone&quot; value=&quot;&amp;lt;%=dto.getMyphone() %&amp;gt;&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;myemail&quot; value=&quot;&amp;lt;%=dto.getMyemail() %&amp;gt;&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주소, 전화번호, 이메일은 수정 가능하므로 input에 기존 값을 넣어준다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;16-4 Controller에서 수정값 받기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 수정 완료 버튼을 누르면 logincontroller.jsp로 값이 전달된다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045108385&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
String myaddr = request.getParameter(&quot;myaddr&quot;);
String myphone = request.getParameter(&quot;myphone&quot;);
String myemail = request.getParameter(&quot;myemail&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780045116905&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyMemberDto dto = new MyMemberDto();
dto.setMyaddr(myaddr);
dto.setMyphone(myphone);
dto.setMyemail(myemail);
dto.setMyno(myno);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수정에 필요한 값들을 DTO에 담는&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;16-5 DAO updateUser() &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Controller는 DTO를 DAO로 전달한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045144035&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean res = dao.updateUser(dto);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAO의 updateUser()는 회원 번호를 기준으로 주소, 전화번호, 이메일을 수정한다 &lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045152734&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql =
&quot; UPDATE MYMEMBER SET MYADDR=?, MYPHONE=?, MYEMAIL=? WHERE MYNO=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수정 성공 시 commit(), 실패 시 rollback()을 실행하고, 성공 여부를 boolean으로 반환&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;17. 회원 탈퇴 기능&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;17-1 탈퇴 요청&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 마이페이지에서 탈퇴 버튼을 누르면 JavaScript 함수가 실행된다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045238160&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function deleteUser(myno){
    location.href=&quot;logincontroller.jsp?command=deleteuser&amp;amp;myno=&quot;+myno;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;b&gt;7-2 Controller에서 탈퇴 처리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 회원 번호를 받아 DAO의 탈퇴 메서드를 실행한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045257951&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
boolean res = dao.deleteMemeber(myno);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;17-3 DAO deleteMember()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;12480&quot; data-start=&quot;12449&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;회원 탈퇴는 실제로 DB에서 행을 삭제하는 것이 아닌 DAO에서 MYENABLED 값을 &quot;N&quot;으로 변경한다&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045284590&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql =
&quot; UPDATE MYMEMBER SET MYENABLED = 'N' WHERE MYNO=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780045295090&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MYENABLED = 'Y' &amp;rarr; 가입
MYENABLED = 'N' &amp;rarr; 탈퇴&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;17-4 탈퇴 결과 처리&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;탈퇴 성공 시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1780045319462&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;request.setAttribute(&quot;msg&quot;,&quot;회원 탈퇴 성공&quot;);
request.setAttribute(&quot;url&quot;,&quot;logincontroller.jsp?command=logout&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780045327596&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;회원 탈퇴 성공
&amp;darr;
logout 요청
&amp;darr;
session 삭제
&amp;darr;
index.jsp 이동&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 탈퇴 성공 후에는 로그아웃을 실행하도록 보낸다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;탈퇴 실패 시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1780045337529&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;request.setAttribute(&quot;msg&quot;,&quot;회원 탈퇴 실패&quot;);
request.setAttribute(&quot;url&quot;,&quot;usermain.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;18. 회원 등급 변경 기능&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;18-1 관리자 회원 목록에서 등급 변경 요청&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; userlistall.jsp에는 회원마다 등급 변경 버튼이 있다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045429109&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onclick=&quot;updateRole(&amp;lt;%=m.getMyno()%&amp;gt;)&quot;&amp;gt;변경&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780045437883&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const updateRole = (myno)=&amp;gt;{
    location.href=&quot;logincontroller.jsp?command=updateroleform&amp;amp;myno=&quot;+myno;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;18-2 Controller에서 회원 정보 조회&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780045446280&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
MyMemberDto dto = dao.selectUser(myno);

request.setAttribute(&quot;selectone&quot;, dto);
pageContext.forward(&quot;updateroleform.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 등급을 변경할 회원의 정보를 조회하고, updateroleform.jsp로 보낸다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;18-3 updateroleform.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; updateroleform.jsp는 회원 등급 변경 화면이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045469532&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyMemberDto tmp = (MyMemberDto)request.getAttribute(&quot;selectone&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- controller에서 넘긴 회원 정보를 꺼낸다&lt;/p&gt;
&lt;pre id=&quot;code_1780045501029&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;select name=&quot;myrole&quot;&amp;gt;
    &amp;lt;option value=&quot;USER&quot;&amp;gt;일반회원&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;MANAGER&quot;&amp;gt;매니저&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;ADMIN&quot;&amp;gt;관리자&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- select 태그로 등급을 선택한다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;18-4 Controller에서 등급 변경 처리&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780045520679&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
String myrole = request.getParameter(&quot;myrole&quot;);

int res = dao.updateRole(myno, myrole);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 회원 번호와 변경할 등급을 받아 DAO로 전달한다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;18-5 DAO updateRole()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; DAO의 updateRole()은 회원 번호를 기준으로 회원 등급을 수정한다 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780045542150&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; UPDATE MYMEMBER SET MYROLE=? WHERE MYNO=? &quot;;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>FullStack Study/10주차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/46</guid>
      <comments>https://lemonpang777.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 31 May 2026 22:22:42 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 44일차 - Server (JSP MVC)</title>
      <link>https://lemonpang777.tistory.com/45</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JSP 게시판 MVC 기능 구현&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상세 조회 / 글쓰기 / 등록 / 수정 / 삭제&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. command 값으로 기능 구분 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Controller가 어떤 기능을 실행할지 결정한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779939678543&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;command=boardlist        &amp;rarr; 목록 조회
command=boarddetail      &amp;rarr; 상세 조회
command=boardinsertform  &amp;rarr; 글쓰기 화면 이동
command=boardinsert      &amp;rarr; 게시글 등록
command=boardupdateform  &amp;rarr; 수정 화면 이동
command=boardupdate      &amp;rarr; 게시글 수정
command=boarddelete      &amp;rarr; 게시글 삭제&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779939694251&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(command.equals(&quot;boarddetail&quot;)) {
    ...
} else if(command.equals(&quot;boardinsertform&quot;)) {
    ...
} else if(command.equals(&quot;boardinsert&quot;)) {
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- command는 Controller에게 전달하는 기능 이름이다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 상세 조회 기능 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 게시글 목록에서 제목을 클릭하면 상세보기로 이동 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779939790365&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;mycontroller.jsp?command=boarddetail&amp;amp;seq=&amp;lt;%=dto.getSeq()%&amp;gt;&quot;&amp;gt;
    &amp;lt;%=dto.getTitle() %&amp;gt;
&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779939799913&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mycontroller.jsp?command=boarddetail&amp;amp;seq=글번호&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;부분&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mycontroller.jsp&lt;/td&gt;
&lt;td&gt;Controller JSP로 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;command=boarddetail&lt;/td&gt;
&lt;td&gt;상세 조회 기능 실행 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seq=글번호&lt;/td&gt;
&lt;td&gt;몇 번 글인지 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1 파라미터가 2개일 때&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; URL 파라미터가 여러 개일 때는 &amp;amp;로 연결 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779939849253&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mycontroller.jsp?command=boarddetail&amp;amp;seq=3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;width: 51.7442%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;?command=boarddetail&lt;/td&gt;
&lt;td style=&quot;width: 51.7442%;&quot;&gt;첫 번째 파라미터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 48.1395%;&quot;&gt;&amp;amp;seq=3&lt;/td&gt;
&lt;td style=&quot;width: 51.7442%;&quot;&gt;두 번째 파라미터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?는 파라미터 시작, &amp;amp;는 파라미터 추가&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. boarddetail.jsp에서 상세 내용 출력 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;4130&quot; data-start=&quot;4085&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;boarddetail.jsp는 Controller가 넘긴 dto를 꺼낸다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779939935009&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MVCBoardDto dto = (MVCBoardDto)request.getAttribute(&quot;dto&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779956707799&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%=dto.getSeq() %&amp;gt;
&amp;lt;%=dto.getWriter() %&amp;gt;
&amp;lt;%=dto.getTitle() %&amp;gt;
&amp;lt;%=dto.getContent() %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- JSP 표현식으로 화면에 출력&lt;/p&gt;
&lt;pre id=&quot;code_1779939964561&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boardlist.jsp
&amp;darr;
제목 클릭
&amp;darr;
mycontroller.jsp?command=boarddetail&amp;amp;seq=글번호
&amp;darr;
dao.selectOne(seq)
&amp;darr;
request.setAttribute(&quot;dto&quot;, res)
&amp;darr;
boarddetail.jsp
&amp;darr;
상세 내용 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 글쓰기 화면 이동 기능&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 목록 페이지에서 글쓰기 버튼을 누르면 Controller로 이동한다 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779940185177&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;button&quot; value=&quot;글쓰기&quot;
       onclick=&quot;location.href='mycontroller.jsp?command=boardinsertform'&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller에서는 boardinsertform 요청을 받으면 글쓰기 페이지로 이동&lt;/p&gt;
&lt;pre id=&quot;code_1779940210095&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;response.sendRedirect(&quot;boardinsert.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 글쓰기 화면으로 단순 이동만 하면 되기에 redirect 사용&lt;/p&gt;
&lt;pre id=&quot;code_1779940284575&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;조회한 데이터를 request에 담아 보낼 필요 없음
&amp;rarr; redirect 사용 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. boardinsert.jsp&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-1 글쓰기 form&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;boardinsert.jsp는 사용자가 글을 작성하는 화면&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779940359255&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;mycontroller.jsp&quot; method=&quot;post&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 값을 mycontroller.jsp로 보낸다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-2 hidden으로 command 전달&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779940388236&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;hidden&quot; name=&quot;command&quot; value=&quot;boardinsert&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숨겨진&amp;nbsp;input을&amp;nbsp;통해&amp;nbsp;command&amp;nbsp;값을&amp;nbsp;Controller로&amp;nbsp;전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-3 입력값 name 속성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 사용자가 입력하는 값들은 각각 name을 가진다 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779940412404&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; name=&quot;writer&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;title&quot;&amp;gt;
&amp;lt;textarea rows=&quot;10&quot; cols=&quot;60&quot; name=&quot;content&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller에서 값을 꺼낼 때 name 값을 사용&lt;/p&gt;
&lt;pre id=&quot;code_1779940430040&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;request.getParameter(&quot;writer&quot;);
request.getParameter(&quot;title&quot;);
request.getParameter(&quot;content&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 게시글 등록 처리&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1 Controller에서 form 값 받기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 등록 버튼을 누르면 form 데이터가 mycontroller.jsp로 전송&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller에서는 command=boardinsert를 확인하고 글 등록을 처리 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779940531295&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String writer = request.getParameter(&quot;writer&quot;);
String title = request.getParameter(&quot;title&quot;);
String content = request.getParameter(&quot;content&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- form에서 입력한 작성자, 제목, 내용을 Controller에서 받는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2 DTO 객체 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;받은 값을 DTO 객체에 담는다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779940564602&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MVCBoardDto dto = new MVCBoardDto(0, writer, title, content, null);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-3 DAO insert 실행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;5991&quot; data-start=&quot;5964&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller는 DTO를 DAO로 전달한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779940587798&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int res = dao.insert(dto);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAO에서 INSERT 작업을 실행하고, 결과를 res로 돌려준다&lt;/p&gt;
&lt;pre id=&quot;code_1779940601787&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res &amp;gt; 0 &amp;rarr; 등록 성공
res == 0 &amp;rarr; 등록 실패&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-custom-highlighting-behavior=&quot;boundary&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. result.jsp 공통 결과 페이지 &lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;6028&quot; data-start=&quot;5988&quot; data-ke-size=&quot;size16&quot;&gt;등록, 수정, 삭제 결과는 result.jsp에서 공통으로 출력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1779956980718&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;msg = 글 작성 완료
url = ?command=boardlist&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779940666952&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;request.setAttribute(&quot;msg&quot;, msg);
request.setAttribute(&quot;url&quot;, url);
pageContext.forward(&quot;result.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller에서는 메시지와 이동할 주소를 request에 저장한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-custom-highlighting-behavior=&quot;boundary&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1779956939685&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String msg = (String)request.getAttribute(&quot;msg&quot;);
String url = (String)request.getAttribute(&quot;url&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;- result.jsp에서는 이 값을 꺼낸다&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1779956950785&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onclick=&quot;location.href='mycontroller.jsp&amp;lt;%=url%&amp;gt;'&quot;&amp;gt;확인&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메시지를 출력하고, 확인 버튼을 누르면 다시 Controller로 이동한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 71px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;값&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;msg&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;화면에 출력할 메시지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 27px;&quot;&gt;
&lt;td style=&quot;height: 27px;&quot;&gt;url&lt;/td&gt;
&lt;td style=&quot;height: 27px;&quot;&gt;확인 버튼 클릭 시 이동할 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 게시글 수정 화면&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-1 boardupdate.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; boardupdate.jsp는 게시글 수정 화면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 화면은 빈 입력창을 보여주는 것이 아니라, 기존 게시글 내용을 먼저 가져와서 form 안에 출력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1779955767503&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Controller에서 기존 게시글 조회
&amp;darr;
request.setAttribute(&quot;dto&quot;, dto)
&amp;darr;
boardupdate.jsp로 forward
&amp;darr;
boardupdate.jsp에서 dto 꺼내기
&amp;darr;
form에 기존 값 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-2 기존 값 출력&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수정 화면에서는 form 안에 기존 내용을 넣어준다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779955813568&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; value=&quot;&amp;lt;%=dto.getTitle() %&amp;gt;&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 제목을 input 태그 안에 출력한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. hidden input&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1779955858261&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;hidden&quot; name=&quot;command&quot; value=&quot;boardupdate&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;seq&quot; value=&quot;&amp;lt;%=dto.getSeq()%&amp;gt;&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hidden은 화면에는 보이지 않지만, submit할 때 함께 전송되는 값이다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;hidden 값&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;command=boardupdate&lt;/td&gt;
&lt;td&gt;Controller에게 수정 기능 실행 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seq=게시글번호&lt;/td&gt;
&lt;td&gt;몇 번 글을 수정할지 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. 게시글 수정 처리 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;7428&quot; data-start=&quot;7390&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수정 버튼을 누르면 form 데이터가 Controller로 전송된다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779955952415&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;command = boardupdate
seq = 게시글 번호
title = 수정한 제목
content = 수정한 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전송되는 값&lt;/p&gt;
&lt;pre id=&quot;code_1779955996277&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;command=boardupdate 확인
&amp;darr;
seq, title, content 값 받기
&amp;darr;
DTO 객체 생성
&amp;darr;
dao.update(dto)
&amp;darr;
결과에 따라 msg, url 저장
&amp;darr;
result.jsp로 forward&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller에서는 boardupdate 요청을 확인한 뒤 값을 받는다.&lt;/p&gt;
&lt;pre id=&quot;code_1779957105029&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MVCBoardDto dto = new MVCBoardDto(seq, null, title, content, null);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작성자와 작성일은 수정하지 않으므로 null로 둔다&lt;/p&gt;
&lt;pre id=&quot;code_1779957124076&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; UPDATE MVCBOARD SET TITLE=?, CONTENT=? WHERE SEQ=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;값&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seq&lt;/td&gt;
&lt;td&gt;수정할 게시글 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;수정한 제목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content&lt;/td&gt;
&lt;td&gt;수정한 내용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;11. 게시글 삭제 처리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;흐름&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779956154877&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;삭제 버튼 클릭
&amp;darr;
mycontroller.jsp?command=boarddelete&amp;amp;seq=게시글번호
&amp;darr;
Controller에서 seq 받기
&amp;darr;
dao.delete(seq)
&amp;darr;
결과에 따라 result.jsp로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779957164445&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int seq = Integer.parseInt(request.getParameter(&quot;seq&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller에서는 seq를 받아 숫자로 변환&lt;/p&gt;
&lt;pre id=&quot;code_1779956208040&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; DELETE FROM MVCBOARD WHERE SEQ=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 삭제에 필요한 것은 게시글 번호 한 개이므로 한 개만 받아온다&lt;/p&gt;
&lt;pre id=&quot;code_1779957224174&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;url = ?command=boardlist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 삭제 성공 시 목록으로 이동하도록 url 설정&lt;/p&gt;</description>
      <category>FullStack Study/10주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/45</guid>
      <comments>https://lemonpang777.tistory.com/45#entry45comment</comments>
      <pubDate>Fri, 29 May 2026 08:44:47 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 43일차 - Server(JSP CRUD / MVC)</title>
      <link>https://lemonpang777.tistory.com/44</link>
      <description>&lt;h2 data-end=&quot;263&quot; data-start=&quot;243&quot; data-section-id=&quot;1qdvhma&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JSP 게시판 CRUD 기능 구현&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. JSP 게시판 전체 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1779870667919&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mylist.jsp
 ├─ 상세 조회 &amp;rarr; selectone.jsp
 ├─ 글쓰기 &amp;rarr; myinsert.jsp &amp;rarr; myinsert_res.jsp
 ├─ 수정 &amp;rarr; myupdate.jsp &amp;rarr; myupdate_res.jsp
 └─ 삭제 &amp;rarr; mydelete.jsp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 164px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JSP 파일&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;mylist.jsp&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;게시글 목록 출력, 상세/글쓰기 페이지로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;selectone.jsp&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;게시글 번호를 받아 상세 내용 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;myinsert.jsp&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;글쓰기 입력 form 화면&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;myinsert_res.jsp&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;입력값을 받아 DB에 게시글 등록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;myupdate.jsp&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;기존 게시글 내용을 수정 form에 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;myupdate_res.jsp&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;수정된 값을 받아 DB UPDATE 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;mydelete.jsp&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;게시글 번호를 받아 DB DELETE 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 상세 조회 기능&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1 mylist.jsp에서 상세페이지로 이동&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779870730578&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;./selectone.jsp?myno=&amp;lt;%= list.get(i).getMyno() %&amp;gt;&quot;&amp;gt;
    &amp;lt;%= list.get(i).getMytitle() %&amp;gt;
&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;%= %&amp;gt;을 이용하여 HTML안에서 Java 코드를 구현 및 JSP라는 것을 알 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. URL 파라미터 전달&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; URL 파라미터는 URL 뒤에 값을 붙여서 다른 페이지로 전달하는 방식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779870887328&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;페이지주소?이름=값

selectone.jsp?myno=5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- selectone.jsp로 이동하면서 myno라는 이름으로 5를 전달&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;부분&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;selectone.jsp&lt;/td&gt;
&lt;td&gt;이동할 JSP 페이지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;파라미터 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;myno&lt;/td&gt;
&lt;td&gt;전달할 값의 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;전달할 실제 값&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 전달된 파라미터 받기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 다른 JSP에서 전달한 값은 request.getParameter()로 받는다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779870966342&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1 request.getParameter()&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779870989648&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;request.getParameter(&quot;myno&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;myno라는 이름으로 전달된 값을 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 주소가&lt;/p&gt;
&lt;pre id=&quot;code_1779871010973&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;selectone.jsp?myno=5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라면 request.getParameter(&quot;myno&quot;)의 결과는 5로 전달된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-2 Integet.parseInt()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request.getParameter()로 받은 값은 문자열이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 게시글 번호는 숫자로 사용해야함으로 문자열을 int로 변환해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1779871087297&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. selectone.jsp와 selectOne() &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;selectone.jsp에서는 전달받은 myno를 이용해 DAO의 selectOne()을 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871135340&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));

    MyBoardDao dao = new MyBoardDao();
    MyBoardDto dto = dao.selectOne(myno);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;흐름&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871161427&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. URL로 전달된 myno 값 받기
2. 문자열을 숫자로 변환
3. DAO 객체 생성
4. dao.selectOne(myno) 실행
5. 조회 결과를 DTO에 저장
6. DTO 값을 JSP 화면에 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 글쓰기 기능&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1 myinsert.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; myinsert.jsp는 게시글을 작성하는 입력 화면이다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871249590&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;myinsert_res.jsp&quot; method=&quot;post&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; name=&quot;myname&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; name=&quot;mytitle&quot;&amp;gt;
    &amp;lt;textarea rows=&quot;10&quot; cols=&quot;60&quot; name=&quot;mycontent&quot;&amp;gt;&amp;lt;/textarea&amp;gt;

    &amp;lt;input type=&quot;submit&quot; value=&quot;입력&quot;&amp;gt;
    &amp;lt;input type=&quot;button&quot; value=&quot;취소&quot; onclick=&quot;history.back();&quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- J &lt;span&gt;SP 페이지에서 사용자 입력 화면을 만들고, &lt;/span&gt;&lt;span&gt;입력값을 다른 JSP로 전송한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2 form 태그&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779871288120&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;myinsert_res.jsp&quot; method=&quot;post&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;속성&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;action&lt;/td&gt;
&lt;td&gt;입력값을 처리할 JSP 페이지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;method&lt;/td&gt;
&lt;td&gt;값을 보내는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 게시글 등록 기능&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-1 myinsert_res.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;글쓰기 form에서 전달된 값을 받아 DB에 저장하는 처리용 JSP이다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871356016&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;form 값 받기
&amp;darr;
DTO 객체 생성
&amp;darr;
DAO insert 실행
&amp;darr;
결과에 따라 alert 출력
&amp;darr;
목록으로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-2 JSP에서 form 값 받기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; myinsert.jsp에서 보낸 값을 request.getParameter()로 받는다. &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871377630&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    String name = request.getParameter(&quot;myname&quot;);
    String title = request.getParameter(&quot;mytitle&quot;);
    String content = request.getParameter(&quot;mycontent&quot;);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-3 JSP에서 DTO 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; form에서 받은 값을 DTO 객체에 담는다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871416944&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    MyBoardDto dto = new MyBoardDto(0, name, title, content, null);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;값&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;게시글 번호는 DB 시퀀스가 자동 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;작성일은 DB에서 SYSDATE로 자동 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-4 DAO insert 실행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP에서 DAO 객체를 만들고 insert()를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1779871464097&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    MyBoardDao dao = new MyBoardDao();
    int res = dao.insert(dto);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- executeUpdate() 실행 결과가 res에 저장되고, res &amp;gt; 0이면 등록 성공&lt;/p&gt;
&lt;pre id=&quot;code_1779871472085&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql =
&quot; INSERT INTO MYBOARD VALUES(SEQ_MYBOARD.NEXTVAL,?,?,?, SYSDATE) &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-5 JSP에서 등록 결과 처리&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779871506584&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    if(res &amp;gt; 0){
%&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
        alert(&quot;게시글 등록 성공&quot;);
        location.href=&quot;mylist.jsp&quot;;
    &amp;lt;/script&amp;gt;
&amp;lt;%
    } else {
%&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
        alert(&quot;게시글 등록 실패&quot;);
        location.href=&quot;mylist.jsp&quot;;
    &amp;lt;/script&amp;gt;
&amp;lt;%
    }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779871514724&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;서버에서 JSP의 if문 실행
&amp;darr;
성공이면 성공 alert 스크립트 생성
실패이면 실패 alert 스크립트 생성
&amp;darr;
브라우저에서 JavaScript 실행
&amp;darr;
알림창 출력 후 페이지 이동&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 게시글 수정 기능&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-1 myupdate.jsp 역할&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 수정 form에서 넘어온 값을 받아 DB에 UPDATE를 실행하는 JSP&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871570406&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    int no = Integer.parseInt(request.getParameter(&quot;myno&quot;));
    String title = request.getParameter(&quot;mytitle&quot;);
    String content = request.getParameter(&quot;mycontent&quot;);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-2 수정용 DTO 생성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779871592365&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    MyBoardDto dto = new MyBoardDto(no, null, title, content, null);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성자, 작성일은 그대로 유지하기에 null로 둔다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-3 DAO update 실행 &lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779871624195&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    int res = new MyBoardDao().update(dto);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779871633057&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; UPDATE MYBOARD SET MYTITLE=?, MYCONTENT=? WHERE MYNO=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-4 JSP에서 수정 결과 처리 &lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;수정 성공 시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779871656036&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    alert(&quot;게시글 수정 성공&quot;);
    location.href=&quot;selectone.jsp?myno=&amp;lt;%=dto.getMyno() %&amp;gt;&quot;;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수정된 글의 상세 페이지로 이동&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;수정 실패 시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779871682910&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    alert(&quot;게시글 수정 실패&quot;);
    location.href=&quot;myupdate.jsp?myno=&amp;lt;%=dto.getMyno() %&amp;gt;&quot;;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다시 수정 패이자로 이동&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. 게시글 삭제 기능&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-1 mydelete.jsp &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 게시글 번호를 받아 DB에서 해당 글을 삭제하는 처리용 JSP&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779871775719&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    int myno = Integer.parseInt(request.getParameter(&quot;myno&quot;));
    int res = new MyBoardDao().delete(myno);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779871784155&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. URL 파라미터로 myno 받기
2. 숫자로 변환
3. dao.delete(myno) 실행
4. 결과에 따라 JavaScript 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-2 DAO delete 실행&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779871805603&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; DELETE FROM MYBOARD WHERE MYNO=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-3 JSP에서 삭제 결과 처리&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;삭제 성공 시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779871910140&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    alert(&quot;게시글 삭제 성공&quot;);
    location.href=&quot;mylist.jsp&quot;;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 목록 페이지로 이동&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;삭제 실패 시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779871921700&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    alert(&quot;게시글 삭제 실패&quot;);
    location.href=&quot;selectone.jsp?myno=&amp;lt;%=myno%&amp;gt;&quot;;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다시 상세 페이지로 이동&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JSP 게시판 MVC 기능 구현&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게시판 목록 조회&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. JSP MVC 구조 &lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;파일&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View&lt;/td&gt;
&lt;td&gt;index.html, boardlist.jsp&lt;/td&gt;
&lt;td&gt;사용자가 보는 화면&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controller&lt;/td&gt;
&lt;td&gt;mycontroller.jsp&lt;/td&gt;
&lt;td&gt;요청을 받아 어떤 기능을 실행할지 판단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;MVCBoardDao, MVCBoardDto, DB&lt;/td&gt;
&lt;td&gt;데이터 조회와 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. index.html&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 처음 접속하는 메인 화면&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874515686&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;mycontroller.jsp?command=boardlist&quot;&amp;gt;글 목록&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 링크를 클릭하면 boardlist.jsp로 바로 가는 것이 아니라, 먼저 mycontroller.jsp로 이동한다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 94px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;부분&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;mycontroller.jsp&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;요청을 받을 Controller JSP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;?&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;파라미터 전달 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;command&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;요청 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;boardlist&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;게시글 목록 조회 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. command 파라미터&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 기능을 실행하지 알려주는 값&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874605999&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mycontroller.jsp?command=boardlist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;&lt;/b&gt;boardlist 기능을 실행시키라는 의미&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. mycontroller.jsp &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Controller 역할을 하는 JSP&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874654539&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    String command = request.getParameter(&quot;command&quot;);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request.getParameter(&quot;command&quot;)는 URL로 전달된 command 값을 가져온다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Controller에서 기능 구분&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; command 값에 따라 실행할 기능을 결정 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874744504&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    MVCBoardDao dao = new MVCBoardDao();

    if(command.equals(&quot;boardlist&quot;)){
        List&amp;lt;MVCBoardDto&amp;gt; list = dao.selectAll();

        request.setAttribute(&quot;allList&quot;, list);

        pageContext.forward(&quot;boardlist.jsp&quot;);
    }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;흐름&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779874759055&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. command 값 확인
2. command가 &quot;boardlist&quot;인지 확인
3. DAO 객체 생성
4. dao.selectAll() 실행
5. DB에서 게시글 목록 조회
6. 조회 결과를 request에 저장
7. boardlist.jsp로 forward&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mycontroller.jsp는 게시글을 직접 출력하지 않고, 게시글 목록 데이터를 준비한 뒤 boardlist.jsp에게 넘긴다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. DAO 목록 조회&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1779874785391&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public List&amp;lt;MVCBoardDto&amp;gt; selectAll()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779874793133&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; SELECT * FROM MVCBOARD ORDER BY SEQ DESC &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span&gt;MVCBOARD 테이블의 모든 게시글을 조회한다. &lt;/span&gt;&lt;span&gt;SEQ 번호가 큰 순서대로 정렬한다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874814820&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(rs.next()) {
    MVCBoardDto tmp = new MVCBoardDto();

    tmp.setSeq(rs.getInt(1));
    tmp.setWriter(rs.getString(2));
    tmp.setTitle(rs.getString(3));
    tmp.setContent(rs.getString(4));
    tmp.setRegdate(rs.getDate(5));

    res.add(tmp);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조회 결과는 MVCBoardDto 객체에 담고, 여러 개의 DTO를 List에 저장&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. MVCBoardDto&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 게시글 하나의 데이터를 저장하는 객체&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874848567&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int seq;
private String writer;
private String title;
private String content;
private Date regdate;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8.&amp;nbsp;request.setAttribute()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Controller에서 조회한 게시글 목록은 바로 화면에 출력하지 않고, request 객체에 담아서 View JSP로 전달&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874894527&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;request.setAttribute(&quot;allList&quot;, list);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- list 데이터를 allList라는 이름으로 request에 저장한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. pageContext.forward()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Controller에서 데이터를 request에 담은 뒤, &lt;/b&gt;&lt;b&gt;화면을 출력할 JSP로 이동&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874928984&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pageContext.forward(&quot;boardlist.jsp&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- boardlist.jsp로 화면 처리를 넘기는 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forward 사용 시 request에 담은 값이 유지된다.&lt;/p&gt;
&lt;pre id=&quot;code_1779874963634&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mycontroller.jsp
&amp;darr; request에 allList 저장
&amp;darr; forward
boardlist.jsp
&amp;darr; request에서 allList 꺼내 사용 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. boardlist.jsp&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; View 역할을 하는 JSP &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779874989314&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    List&amp;lt;MVCBoardDto&amp;gt; list =
        (List&amp;lt;MVCBoardDto&amp;gt;)request.getAttribute(&quot;allList&quot;);
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- getAttribute()는 Object 타입으로 값을 반환하기 때문에, 원래 타입인 List&amp;lt;MVCBoardDto&amp;gt;로 형변환&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;11. 게시글 처리&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;11-1 게시글이 없을 경우&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779875039227&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    if(list.size()==0){
%&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td colspan=&quot;4&quot;&amp;gt;---- 글이 존재하지 않습니다 ----&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;%
    }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span&gt;list에 게시글이 하나도 없으면 &lt;/span&gt;&lt;span&gt;&quot;글이 존재하지 않습니다&quot; 출력&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;11-2 게시글이 있을 경우&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779875074248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    for(MVCBoardDto dto : list){
%&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%=dto.getSeq() %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%=dto.getWriter() %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%=dto.getTitle() %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%=dto.getRegdate() %&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;%
    }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;12. forward / redirect 차이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;forward&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779875117494&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;서버 내부에서 페이지 이동
request 값 유지
주소창 변경 없음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller에서 request에 담은 allList를 View에서 그대로 사용할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;redirect&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779875129139&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;브라우저가 새로운 페이지를 다시 요청
request 값 유지 안 됨
주소창 변경됨&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redirect는 새로운 요청이기 때문에 기존 request에 담은 값이 사라진다.&lt;/p&gt;</description>
      <category>FullStack Study/10주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/44</guid>
      <comments>https://lemonpang777.tistory.com/44#entry44comment</comments>
      <pubDate>Thu, 28 May 2026 08:50:11 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 42일차 - Server(JSP)</title>
      <link>https://lemonpang777.tistory.com/43</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JSP(Java Server Pages)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTML 안에 JAVA 코드를 넣어서 동적으로 웹페이지를 만들어주는 기술&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779784927074&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTML = 화면 작성
Java = 데이터 처리
JSP = Java로 처리한 결과를 HTML 화면에 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. HTML 한계&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML은 화면을 만드는 언어이다.&lt;/p&gt;
&lt;pre id=&quot;code_1779783071769&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;게시판&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;안녕하세요&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 사용하면 브라우저에 글자가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 HTML은 정적인 화면으로 항상 똑같은 내용만 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 내용은 HTML만으로는 만들기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 데이터는 보통 DB에 저장되어 있고 화면에 보여주기 위해서는 JAVA와 같은 프로그램을 통해 데이터를 가져와야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. JSP 역할&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 화면을 만들면서, 필요할 때 Java 코드를 실행해서 데이터를 가져올 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1779784943554&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Java로 데이터 처리
+
HTML로 화면 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP는 Java와 HTML을 연결해서 동적인 웹 페이지를 만드는 역할을 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. JSP 실행 위치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP는 브라우저가 아닌 서버에서 실행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1779783283774&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용자 브라우저
&amp;darr; 요청
서버
&amp;darr; JSP 실행
Java 코드 처리
&amp;darr;
HTML 결과 생성
&amp;darr; 응답
사용자 브라우저&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 JSP 코드를 직접 보는 것이 아니라, 서버가 JSP를 실행한 뒤 만들어낸 HTML 결과 화면을 보게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. JSP 흐름&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779783324829&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 사용자가 브라우저에서 JSP 페이지 요청
2. 서버가 JSP 파일을 실행
3. JSP 안의 Java 코드가 실행
4. 필요한 데이터를 DB나 Java 객체에서 가져옴
5. 가져온 데이터를 HTML에 넣음
6. 완성된 HTML을 브라우저로 보냄
7. 사용자는 완성된 웹 화면을 봄&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 JAVA 코드를 실행한 결과로 화면을 만들어준다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;JSP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;td&gt;화면 작성&lt;/td&gt;
&lt;td&gt;Java로 처리한 결과를 화면에 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내용 변화&lt;/td&gt;
&lt;td&gt;고정적&lt;/td&gt;
&lt;td&gt;데이터에 따라 변경 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 사용&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB 연결&lt;/td&gt;
&lt;td&gt;직접 불가능&lt;/td&gt;
&lt;td&gt;Java 코드를 통해 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실행 위치&lt;/td&gt;
&lt;td&gt;브라우저가 해석&lt;/td&gt;
&lt;td&gt;서버가 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. HTML / JSP 예시&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779783440199&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;홍길동님 환영합니다.&amp;lt;/p&amp;gt;&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;&lt;b&gt;JSP&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779783460711&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;&amp;lt;%= userName %&amp;gt;님 환영합니다.&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;userName 값에 따라 출력되는 값이 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779783468277&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;userName = 홍길동 &amp;rarr; 홍길동님 환영합니다.
userName = 김철수 &amp;rarr; 김철수님 환영합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. JSP 주요 문법&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6-1 Comment tag &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779783543715&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%-- JSP 주석입니다. --%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP에서 사용하는 주석&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6-2 Directive tag&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779783768767&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 contentType=&quot;text/html; charset=UTF-8&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP 페이지의 설정을 작성할 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1779783790115&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 import=&quot;java.util.List&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- List 클래스를 사용하기 위해 import&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;6-3 Declaration tag &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779783825724&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%!
    int count = 0;

    public int add(int a, int b) {
        return a + b;
    }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수나 메서드를 선언할 때 사용&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6-4 Scriptlet tag&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779783893794&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    String name = &quot;홍길동&quot;;
    int age = 20;
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP 안에서 Java 코드를 실행할 때 사용&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 6-5 Expression tag&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-custom-highlighting-behavior=&quot;boundary&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1779783925845&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%= name %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 변수나 메서드 결과를 화면에 출력할 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1779783942039&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;&amp;lt;%= name %&amp;gt;님 환영합니다.&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name이 '홍길동'이라면 홍길동님 환영합니다. 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;태그 이름&lt;/td&gt;
&lt;td&gt;표기법&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comment tag&lt;/td&gt;
&lt;td&gt;&amp;lt;%-- 주석 --%&amp;gt;&lt;/td&gt;
&lt;td&gt;JSP 주석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Directive tag&lt;/td&gt;
&lt;td&gt;&amp;lt;%@ 지시자 %&amp;gt;&lt;/td&gt;
&lt;td&gt;JSP 페이지 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Declaration tag&lt;/td&gt;
&lt;td&gt;&amp;lt;%! 선언문 %&amp;gt;&lt;/td&gt;
&lt;td&gt;변수 / 메서드 선언&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scriptlet tag&lt;/td&gt;
&lt;td&gt;&amp;lt;% Java 코드 %&amp;gt;&lt;/td&gt;
&lt;td&gt;Java 실행 코드 작성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expression tag&lt;/td&gt;
&lt;td&gt;&amp;lt;%= 표현식 %&amp;gt;&lt;/td&gt;
&lt;td&gt;값을 화면에 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JSP 코드 리뷰&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. index.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;처음 접속하는 메인 페이지 역할&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779784089977&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;index&amp;lt;/h1&amp;gt;

&amp;lt;h3&amp;gt;&amp;lt;a href=&quot;./mylist.jsp&quot;&amp;gt;목록&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크 클릭시 mylist.jsp 로 이동한다.&lt;/p&gt;
&lt;pre id=&quot;code_1779784137412&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용자가 목록 클릭
&amp;darr;
mylist.jsp 요청
&amp;darr;
게시판 목록 화면으로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. mylist.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게시글 목록을 출력하는 JSP 페이지&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779784167507&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;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP 페이지에서 Java를 사용하고, 문자 인코딩을 UTF-8로 설정한다는 것을 의미&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-1 request / response 인코딩 설정&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779784223721&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;% request.setCharacterEncoding(&quot;UTF-8&quot;); %&amp;gt;
&amp;lt;% response.setContentType(&quot;text/html; charset=UTF-8&quot;); %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 보내는 값과 브라우저에 출력되는 값의 문자 인코딩을 UTF-8로 맞추는 코드&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 61.1628%;&quot;&gt;코드&lt;/td&gt;
&lt;td style=&quot;width: 38.7209%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 61.1628%;&quot;&gt;request.setCharacterEncoding(&quot;UTF-8&quot;)&lt;/td&gt;
&lt;td style=&quot;width: 38.7209%;&quot;&gt;요청 데이터 한글 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 61.1628%;&quot;&gt;response.setContentType(...)&lt;/td&gt;
&lt;td style=&quot;width: 38.7209%;&quot;&gt;응답 화면 한글 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. JSP에서 JAVA 클래스 import&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779784292056&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 import = &quot;com.my.dao.MyBoardDao&quot; %&amp;gt;
&amp;lt;%@ page import = &quot;com.my.dto.MyBoardDto&quot; %&amp;gt;
&amp;lt;%@ page import = &quot;java.util.List&quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;import&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MyBoardDao&lt;/td&gt;
&lt;td&gt;DB 조회 메서드 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MyBoardDto&lt;/td&gt;
&lt;td&gt;게시글 데이터 저장 객체 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;게시글 여러 개 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. JSP에서 JAVA 코드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JSP 안에서 Java 코드를 작성할 때는 &amp;lt;% %&amp;gt;를 사용 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779784342778&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    MyBoardDao dao = new MyBoardDao();
    List&amp;lt;MyBoardDto&amp;gt; list = dao.selectAll();
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779784360720&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. MyBoardDao 객체 생성
2. selectAll() 메서드 실행
3. DB에서 게시글 전체 조회
4. 조회 결과를 List&amp;lt;MyBoardDto&amp;gt;에 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;selectAll()은 MYBOARD 테이블의 데이터를 조회하고, 조회 결과를 MyBoardDto 객체로 만들어 List에 담아 반환&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. MyBoardDto&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 게시글 하나의 데이터를 저장하는 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779784403547&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int myno;
private String myname;
private String mytitle;
private String mycontent;
private Date mydate;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에서 조회한 게시글 한 줄이 Java에서는 MyBoardDto 객체 하나로 저장&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. MyBoardDao&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; DB에 접근해서 게시글 데이터를 조회하는 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779784453112&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; SELECT * FROM MYBOARD ORDER BY MYNO DESC &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MYBOARD 테이블의 모든 데이터를 조회한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;게시글 번호가 큰 순서대로 정렬한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6-1 DAO 조회 흐름&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779784485461&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DB 연결
&amp;darr;
SQL 준비
&amp;darr;
SQL 실행
&amp;darr;
ResultSet으로 결과 받기
&amp;darr;
DTO 객체 생성
&amp;darr;
List에 저장
&amp;darr;
DB 종료
&amp;darr;
List 반환&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779784493441&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(rs.next()) {
    MyBoardDto dto =
        new MyBoardDto(
            rs.getInt(1),
            rs.getString(2),
            rs.getString(3),
            rs.getString(4),
            rs.getDate(5)
        );

    res.add(dto);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. JSP에서 table로 출력&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; DB에서 가져온 list를 HTML table에 출력&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779784529448&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;table border=&quot;1&quot;&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;NO&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;NAME&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;TITLE&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;DATE&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블의 제목 줄&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7-1 반복문으로 게시글 출력&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779784554619&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
    for(int i=0; i&amp;lt;list.size(); i++){
%&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= list.get(i).getMyno() %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= list.get(i).getMyname() %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= list.get(i).getMytitle() %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= list.get(i).getMydate() %&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;%
    }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;%= %&amp;gt;는 값을 화면에 출력할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FullStack Study/10주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/43</guid>
      <comments>https://lemonpang777.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 27 May 2026 08:46:52 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 41일차 - Algorithm2 (정렬 / 이진탐색트리)</title>
      <link>https://lemonpang777.tistory.com/42</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 정렬&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러 개의 데이터를 일정한 기준에 따라 순서대로 배치하는 것&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 삽입 정렬&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열의 요소를 하나씩 선택한 뒤, 그 요소가 들어갈 알맞은 위치를 찾아 삽입하는 방식&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779421139181&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; public static void insertionSort(int[] a) {
	// i = 1부터 시작하는 이유:
	// 0번째 요소는 앞에 비교할 값이 없으므로
	// 일단 정렬된 상태라고 본다.
	for(int i = 1; i &amp;lt; a.length; i++) {
		int j;

		// 현재 삽입할 값
		// 예: a[i] 값을 앞쪽의 알맞은 위치에 넣을 예정
		int tmp = a[i];

		// j는 현재 선택한 위치 i부터 시작
		// j &amp;gt; 0 : 배열의 맨 앞을 넘지 않도록 하는 조건
		// a[j - 1] &amp;gt; tmp : 앞쪽 값이 tmp보다 크면 뒤로 밀어야 함
		for(j = i; j &amp;gt; 0 &amp;amp;&amp;amp; a[j - 1] &amp;gt; tmp; j--) {
			// 앞쪽 값이 tmp보다 크므로 한 칸 뒤로 이동
			a[j] = a[j - 1];
 		}

		// 반복문이 끝난 위치 j가 tmp가 들어갈 자리
		a[j] = tmp;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmp는 현재 선택된 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞쪽 값들이 tmp보다 크면 한칸씩 뒤로 밀고, 알맞은 자리에 tmp를 삽입&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2 순서&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하나를 선택한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;앞쪽 데이터들과 비교한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;큰 값들을 뒤로 민다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;알맞은 위치에 삽입한다.&lt;/span&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;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIlCsY/dJMcadWnYru/JNV8A2BolUe6E0gznky111/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIlCsY/dJMcadWnYru/JNV8A2BolUe6E0gznky111/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIlCsY/dJMcadWnYru/JNV8A2BolUe6E0gznky111/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIlCsY%2FdJMcadWnYru%2FJNV8A2BolUe6E0gznky111%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;500&quot; height=&quot;375&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;3. 선택 정렬&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;정렬되지 않은 부분에서 가장 작은 값을 찾아 맨 앞으로 보내는 방식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;3-1 코드&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779421414455&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void selectionSort(int[] a) {

	// i는 현재 정렬할 위치
	// 마지막 요소는 자동으로 정렬되므로 a.length - 1까지만 반복
	for(int i = 0; i &amp;lt; a.length - 1; i++) {

		// min은 가장 작은 값의 인덱스를 저장하는 변수
		// 처음에는 현재 위치 i를 최솟값 위치라고 가정
		int min = i;

		// i 다음 위치부터 배열 끝까지 비교
		// 정렬되지 않은 부분에서 최솟값 찾기
		for(int j = i + 1; j &amp;lt; a.length; j++) {

			// 현재 j 위치의 값이 min 위치의 값보다 작다면
			if(a[j] &amp;lt; a[min]) {

			// 최솟값 위치를 j로 변경
			min = j;
			}
		}

		// 최솟값을 찾았으므로
		// 현재 위치 i와 최솟값 위치 min을 교환
		int tmp = a[i];
		a[i] = a[min];
		a[min] = tmp;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;3-2 순서&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정렬되지 않은 부분에서 최솟값을 찾는다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;최솟값을 맨 앞으로 보낸다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;다음 위치에서 다시 반복한다.&lt;/span&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;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyT7pF/dJMcahR04yw/jXVU8Lboe0RwSLMkI49eH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyT7pF/dJMcahR04yw/jXVU8Lboe0RwSLMkI49eH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyT7pF/dJMcahR04yw/jXVU8Lboe0RwSLMkI49eH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyT7pF%2FdJMcahR04yw%2FjXVU8Lboe0RwSLMkI49eH0%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;500&quot; height=&quot;375&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;4. 퀵 정렬&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;기준 값을 하나 정한 뒤, 그 기준값보다 작은 값은 왼쪽, 큰 값을 오른쪽으로 나누면서 정렬하는 방식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;이때 기준 값은 피벗이라고 한다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;4-1 코드&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779421496163&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void quickSort(int[] a, int left, int right) {

	// 왼쪽에서 오른쪽으로 이동할 커서
	int lc = left;

	// 오른쪽에서 왼쪽으로 이동할 커서
	int rc = right;

	// 피벗 선택
	// 여기서는 정렬 범위의 가운데 값을 피벗으로 사용
	int x = a[(lc + rc) / 2];

	do {
		// 왼쪽 커서는 피벗보다 작은 값을 만나면 계속 오른쪽으로 이동
		// 피벗보다 크거나 같은 값을 만나면 멈춤
		while(a[lc] &amp;lt; x) {
			lc++;
		}

		// 오른쪽 커서는 피벗보다 큰 값을 만나면 계속 왼쪽으로 이동
		// 피벗보다 작거나 같은 값을 만나면 멈춤
		while(a[rc] &amp;gt; x) {
			rc--;
		}

		// lc가 rc보다 왼쪽에 있거나 같은 위치라면 교환 가능
		if(lc &amp;lt;= rc) {

			// 왼쪽에서 찾은 큰 값과
			// 오른쪽에서 찾은 작은 값을 교환
			int tmp = a[lc];
			a[lc] = a[rc];
			a[rc] = tmp;

			// 교환 후 커서를 한 칸씩 이동
			lc++;
			rc--;
		}

	// 왼쪽 커서와 오른쪽 커서가 엇갈릴 때까지 반복
	} while(lc &amp;lt;= rc);

	// 왼쪽 부분에 아직 정렬할 값이 남아 있으면 다시 퀵 정렬
	if(left &amp;lt; rc) {
		quickSort(a, left, rc);
	}

	// 오른쪽 부분에 아직 정렬할 값이 남아 있으면 다시 퀵 정렬
	if(right &amp;gt; lc) {
		quickSort(a, lc, right);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-2 변수 의미&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.6977%;&quot;&gt;변수&lt;/td&gt;
&lt;td style=&quot;width: 64.186%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.6977%;&quot;&gt;left&lt;/td&gt;
&lt;td style=&quot;width: 64.186%;&quot;&gt;정렬할 범위의 시작 인덱스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.6977%;&quot;&gt;right&lt;/td&gt;
&lt;td style=&quot;width: 64.186%;&quot;&gt;정렬할 범위의 끝 인덱스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.6977%;&quot;&gt;lc&lt;/td&gt;
&lt;td style=&quot;width: 64.186%;&quot;&gt;왼쪽에서 오른쪽으로 이동하는 커서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.6977%;&quot;&gt;rc&lt;/td&gt;
&lt;td style=&quot;width: 64.186%;&quot;&gt;오른쪽에서 왼쪽으로 이동하는 커서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.6977%;&quot;&gt;x&lt;/td&gt;
&lt;td style=&quot;width: 64.186%;&quot;&gt;피벗 값&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;4-3 순서&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;피벗을 정한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;피벗보다 작은 값은 왼쪽으로 보낸다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;피벗보다 큰 값은 오른쪽으로 보낸다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;나뉜 왼쪽/오른쪽을 다시 정렬한다.&lt;/span&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;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xN7HL/dJMcahkf2GF/QQ9Nt0tGmUDRKct5owXEVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xN7HL/dJMcahkf2GF/QQ9Nt0tGmUDRKct5owXEVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xN7HL/dJMcahkf2GF/QQ9Nt0tGmUDRKct5owXEVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxN7HL%2FdJMcahkf2GF%2FQQ9Nt0tGmUDRKct5owXEVk%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;500&quot; height=&quot;375&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 병합 정렬&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열을 계속 반으로 나눈 뒤, 작은 단위부터 정렬하면서 다시 합치는 정렬&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-1 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779439790274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 병합할 때 임시로 값을 저장할 배열
// 왼쪽 배열 값을 잠시 보관하는 용도로 사용
static int[] buff;

public static void mergeSort(int[] a) {

	// 원본 배열과 같은 크기의 임시 배열 생성
	buff = new int[a.length];

	// 배열 전체 범위를 정렬
	// 시작 인덱스: 0
	// 끝 인덱스: a.length - 1
	mSort(a, 0, a.length - 1);
}

public static void mSort(int[] a, int left, int right) {

	// left가 right보다 작을 때만 나눌 수 있음
	// 예: left == right 이면 요소가 1개라 더 이상 나눌 필요 없음
	if(left &amp;lt; right) {

		// 배열을 반으로 나누기 위한 가운데 인덱스
		int center = (left + right) / 2;

		// buff 배열의 인덱스
		int p = 0;

		// buff 배열을 읽을 때 사용할 인덱스
		int j = 0;

		// 원본 배열 a에 다시 값을 넣을 위치
		int k = left;

		// 왼쪽 부분 정렬
		mSort(a, left, center);

		// 오른쪽 부분 정렬
		mSort(a, center + 1, right);

		// 왼쪽 부분 배열을 buff에 복사
		// 예: a[left] ~ a[center] 값을 buff에 저장
		for(int i = left; i &amp;lt;= center; i++) {
			buff[p++] = a[i];
		}

		// 오른쪽 부분의 시작 위치
		int i = center + 1;

		// buff에 저장된 왼쪽 부분과
		// a 배열의 오른쪽 부분을 비교하면서 작은 값을 a에 넣음
		while(i &amp;lt;= right &amp;amp;&amp;amp; j &amp;lt; p) {

			// buff[j] &amp;lt;= a[i] 이면 buff[j]를 a[k]에 넣고 j 증가
			// 아니면 a[i]를 a[k]에 넣고 i 증가
			a[k++] = (buff[j] &amp;lt;= a[i]) ? buff[j++] : a[i++];
		}

		// 오른쪽 부분은 이미 a 배열 안에 남아 있으므로
		// buff에 남은 값만 원본 배열 a에 복사하면 됨
		while(j &amp;lt; p) {
			a[k++] = buff[j++];
 		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-2 흐름&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;배열을 반으로 나눈다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;왼쪽을 정렬한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;오른쪽을 정렬한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;두 부분을 작은 값부터 다시 합친다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4yf9M/dJMcagr4xmS/mZy2Qb9i3BrAG55JILQoUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4yf9M/dJMcagr4xmS/mZy2Qb9i3BrAG55JILQoUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4yf9M/dJMcagr4xmS/mZy2Qb9i3BrAG55JILQoUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4yf9M%2FdJMcagr4xmS%2FmZy2Qb9i3BrAG55JILQoUk%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;500&quot; height=&quot;625&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 버블 정렬&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 옆에 있는 두 값을 비교해서 순서가 틀리면 바꾸는 정렬&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1-1 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779440074810&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void bubbleSort(int[] a) {

	// 배열 전체를 여러 번 반복
	// 한 번 반복할 때마다 작은 값이 앞쪽으로 이동
	for(int i = 0; i &amp;lt; a.length - 1; i++) {

		// 교환 횟수 저장 변수
		// 한 번도 교환이 없으면 이미 정렬된 상태라고 판단 가능
		int cnt = 0;

		// 뒤쪽에서 앞쪽 방향으로 인접한 두 값 비교
		// j는 배열의 마지막 인덱스부터 시작
		for(int j = a.length - 1; j &amp;gt; i; j--) {

			// 앞 값이 뒤 값보다 크면 순서가 잘못된 상태
			if(a[j - 1] &amp;gt; a[j]) {

				// 두 값 교환
				int tmp = a[j - 1];
				a[j - 1] = a[j];
				a[j] = tmp;

				// 교환이 일어났으므로 cnt 증가
				cnt++;
			}
		}
		
		// 이번 반복에서 한 번도 교환이 없었다면
		// 이미 정렬이 끝난 상태이므로 반복 종료
		if(cnt == 0) {
			break;
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1-2 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779440145248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void bubbleSort2(int[] a) {

	// 앞에서부터 인접한 요소 두 개를 비교해가며 정렬
	// 한 번 반복할 때마다 가장 큰 값이 오른쪽으로 이동
	for(int i = 0; i &amp;lt; a.length - 1; i++) {

		// 교환 횟수 저장 변수
		int cnt = 0;

		// 앞에서부터 인접한 두 값 비교
		// a[j]와 a[j + 1]을 비교
		for(int j = i; j &amp;lt; a.length - 1 - i; j++) {

			// 앞 값이 뒤 값보다 크면 교환
			if(a[j] &amp;gt; a[j + 1]) {

				// 두 값 교환
				int tmp = a[j + 1];
				a[j + 1] = a[j];
				a[j] = tmp;

				// 교환 횟수 증가
				cnt++;
			}
		}

		// 교환이 한 번도 없으면 이미 정렬된 상태
		if(cnt == 0) {
			break;
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2 흐름&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;앞에서부터 두 개씩 비교한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;앞 값이 더 크면 바꾼다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;큰 값이 점점 오른쪽으로 이동한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;반복하면서 정렬된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qkeNe/dJMcafNwsBa/SfLcWc2kYQKjcjsW9jnrt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qkeNe/dJMcafNwsBa/SfLcWc2kYQKjcjsW9jnrt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qkeNe/dJMcafNwsBa/SfLcWc2kYQKjcjsW9jnrt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqkeNe%2FdJMcafNwsBa%2FSfLcWc2kYQKjcjsW9jnrt0%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;500&quot; height=&quot;625&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 이진탐색트리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 데이터를 크기 기준으로 왼쪽 / 오른쪽에 나누어 저장하는 자료구조&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 노드보다 작은 값 &amp;rarr; 왼쪽&lt;/span&gt;&lt;br /&gt;&lt;span&gt;현재 노드보다 큰 값 &amp;rarr; 오른쪽&lt;/span&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;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mL3da/dJMcabdc6Vx/l4kDxJedfk3dsDSNOWpSuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mL3da/dJMcabdc6Vx/l4kDxJedfk3dsDSNOWpSuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mL3da/dJMcabdc6Vx/l4kDxJedfk3dsDSNOWpSuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmL3da%2FdJMcabdc6Vx%2Fl4kDxJedfk3dsDSNOWpSuK%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;500&quot; height=&quot;375&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-1 Node 클래스&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;트리에서 데이터 하나를 저장하는 단위를 노드(Node)라고 한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779708692662&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node&amp;lt;K, V&amp;gt; {
    private K key;          // 비교 기준이 되는 값
    private V data;         // 실제 저장할 데이터
    private Node&amp;lt;K,V&amp;gt; left; // 왼쪽 자식 노드
    private Node&amp;lt;K,V&amp;gt; right;// 오른쪽 자식 노드
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.5349%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 65.3488%;&quot;&gt;뜻&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.5349%;&quot;&gt;key&lt;/td&gt;
&lt;td style=&quot;width: 65.3488%;&quot;&gt;비교 기준이 되는 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.5349%;&quot;&gt;data&lt;/td&gt;
&lt;td style=&quot;width: 65.3488%;&quot;&gt;실제로 저장할 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.5349%;&quot;&gt;left&lt;/td&gt;
&lt;td style=&quot;width: 65.3488%;&quot;&gt;왼쪽 자식 노드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.5349%;&quot;&gt;right&lt;/td&gt;
&lt;td style=&quot;width: 65.3488%;&quot;&gt;오른쪽 자식 노드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-2 K, V 제네릭 &lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779708826820&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BinarySearchTree&amp;lt;K,V&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;K&amp;nbsp;=&amp;nbsp;key의&amp;nbsp;자료형 &lt;br /&gt;V&amp;nbsp;=&amp;nbsp;data의&amp;nbsp;자료형&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1779709055482&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BinarySearchTree&amp;lt;Integer, Data&amp;gt; tree = new BinarySearchTree&amp;lt;Integer, Data&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key는&amp;nbsp;Integer&amp;nbsp;타입 &lt;br /&gt;data는&amp;nbsp;Data&amp;nbsp;타입&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-3 root&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779709075208&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private Node&amp;lt;K,V&amp;gt; root;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root는 트리의 시작 노드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리는 검색, 추가할 때 항상 root부터 시작&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-4 key 비교&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779709116672&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int cond = com(key, n.getKey());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교 결과에 따라 왼쪽으로 갈지, 오른쪽으로 갈지 결정&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.2558%;&quot;&gt;결과&lt;/td&gt;
&lt;td style=&quot;width: 58.2558%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 23.4884%;&quot;&gt;이동 방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.2558%;&quot;&gt;음수&lt;/td&gt;
&lt;td style=&quot;width: 58.2558%;&quot;&gt;찾는 key가 현재 key보다 작음&lt;/td&gt;
&lt;td style=&quot;width: 23.4884%;&quot;&gt;왼쪽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.2558%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 58.2558%;&quot;&gt;key가 같음&lt;/td&gt;
&lt;td style=&quot;width: 23.4884%;&quot;&gt;찾음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.2558%;&quot;&gt;양수&lt;/td&gt;
&lt;td style=&quot;width: 58.2558%;&quot;&gt;찾는 key가 현재 key보다 큼&lt;/td&gt;
&lt;td style=&quot;width: 23.4884%;&quot;&gt;오른쪽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-5 검색 search()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;검색은 원하는 key를 가진 데이터를 찾는 기능&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;흐름&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;root부터 시작&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;찾는 key와 현재 노드 key 비교&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;같으면 데이터 반환&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;작으면 왼쪽 이동&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;크면 오른쪽 이동&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;끝까지 못 찾으면 null 반환&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779709215520&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Node&amp;lt;K,V&amp;gt; n = root;

while(true) {
    if(n == null) {
        return null;
    }

    int cond = com(key, n.getKey());

    if(cond == 0) {
        return n.getValue();
    } else if(cond &amp;lt; 0) {
        n = n.left;
    } else {
        n = n.right;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root부터 시작해서 key를 비교하고, 작으면 왼쪽 노드, 크면 오른쪽 노드로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key와 같으면 해당 노드의 data를 반환&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-6 추가 add()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;노드 추가 시 규칙&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;작으면 왼쪽&lt;/span&gt;&lt;br /&gt;&lt;span&gt;크면 오른쪽&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779709395241&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(root==null) {
			root = new Node&amp;lt;K,V&amp;gt;(key,data,null,null);
		}else {
			addNode(root,key,data);
		}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root가 있다면 addNode()를 이용해 들어갈 위치를 찾음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;흐름&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;추가할 key와 현재 노드 key 비교&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;같으면 추가하지 않음&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;작으면 왼쪽으로 이동&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;크면 오른쪽으로 이동&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;비어 있는 위치를 찾으면 새 노드 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-7 출력 print()&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;출력 순서&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;왼쪽 출력&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;현재 노드 출력&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;오른쪽 출력&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779709902550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void printSubTree(Node node) {
    if(node != null) {
        printSubTree(node.left);
        System.out.println(node.key + &quot; &quot; + node.data);
        printSubTree(node.right);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-8 삭제 remove()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 왼쪽 자식이 없는 경우&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2. 오른쪽 자식이 없는 경우&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3. 자식이 2개 있는 경우&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;7-8-1 삭제할 노드 찾기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779710026191&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Node&amp;lt;K,V&amp;gt; p = root;
Node&amp;lt;K,V&amp;gt; parent = null;
boolean isLeftChild = true;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 36.2791%;&quot;&gt;변수&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 63.6046%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 36.2791%;&quot;&gt;p&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 63.6046%;&quot;&gt;현재 확인 중인 노드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 36.2791%;&quot;&gt;parent&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 63.6046%;&quot;&gt;현재 노드의 부모 노드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 36.2791%;&quot;&gt;isLeftChild&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 63.6046%;&quot;&gt;현재 노드가 부모의 왼쪽 자식인지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7-8-2 왼쪽 자식이 없는 경우&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제할 노드의 왼쪽 자식이 없다면, 삭제할 노드 대신 오른쪽 자식을 연결&lt;/p&gt;
&lt;pre id=&quot;code_1779710293608&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(p.left == null) {
    parent.left = p.right;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7-8-3&amp;nbsp; 오른쪽 자식이 없는 경우&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제할 노드의 오른쪽 자식이 없다면, 삭제할 노드 대신 왼쪽 자식을 연결&lt;/p&gt;
&lt;pre id=&quot;code_1779710388033&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;else if(p.right == null) {
    parent.left = p.left;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7-8-4 자식이 2개 있는 경우&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779710433160&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Node&amp;lt;K,V&amp;gt; left = p.left;

while(left.right != null) {
    parent = left;
    left = left.right;
}

p.key = left.key;
p.data = left.data;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개념&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tree&lt;/td&gt;
&lt;td&gt;나무처럼 가지가 뻗는 자료구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node&lt;/td&gt;
&lt;td&gt;데이터 하나를 저장하는 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;root&lt;/td&gt;
&lt;td&gt;트리의 시작 노드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;비교 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data&lt;/td&gt;
&lt;td&gt;실제 저장할 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;left&lt;/td&gt;
&lt;td&gt;현재 key보다 작은 값이 연결되는 방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;right&lt;/td&gt;
&lt;td&gt;현재 key보다 큰 값이 연결되는 방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;search&lt;/td&gt;
&lt;td&gt;key를 비교하며 데이터 찾기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;add&lt;/td&gt;
&lt;td&gt;규칙에 맞는 위치에 노드 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;remove&lt;/td&gt;
&lt;td&gt;규칙이 깨지지 않게 노드 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중위 순회&lt;/td&gt;
&lt;td&gt;왼쪽 &amp;rarr; 현재 &amp;rarr; 오른쪽 순서로 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>FullStack Study/9주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/42</guid>
      <comments>https://lemonpang777.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 25 May 2026 21:06:11 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 40일차 - Algorithm (재귀함수 / 이중연결리스트 / 스택,큐)</title>
      <link>https://lemonpang777.tistory.com/41</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 재귀함수 (Recursion)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자기 자신을 다시 호출하는 함수&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수 안에서 자기 자신을 다시 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;종료 조건이 반드시 있어야 함&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2 팩토리얼 함수&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779335379297&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static int factorial(int no) {
    return (no==1)? 1: no*factorial(no-1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- no가 1이면 1 반환 아니면 '현재값 * factorial(no-1)' 반환&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 유클리드 호제법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 수의 최대 공약수를 구하는 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779335506440&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static int eculid(int no1, int no2) {
    if(no2==0) {
        return no1;
    }else {
        return eculid(no2,no1%no2);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span&gt;큰 수를 작은 수로 나눈 나머지를 이용&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 나머지가 0이 될 때의 수가 최대공약수&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 하노이탑&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1779335634827&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void hanoi(int no, int x, int y) {
	if(no&amp;gt;1) {
		hanoi(no-1,x,6-x-y);
	}
	System.out.println(&quot;원판: &quot; + no +&quot;을 &quot; + x + &quot;기둥에서 &quot; + y + &quot;기둥으로 옮김&quot;);	
	if(no&amp;gt;1) {
		hanoi(no-1,6-x-y,y);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.2093%;&quot;&gt;매개변수&lt;/td&gt;
&lt;td style=&quot;width: 52.7907%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.2093%;&quot;&gt;no&lt;/td&gt;
&lt;td style=&quot;width: 52.7907%;&quot;&gt;원판 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.2093%;&quot;&gt;x&lt;/td&gt;
&lt;td style=&quot;width: 52.7907%;&quot;&gt;시작 기둥&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.2093%;&quot;&gt;y&lt;/td&gt;
&lt;td style=&quot;width: 52.7907%;&quot;&gt;목표 기둥&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.2093%;&quot;&gt;6-x-y&lt;/td&gt;
&lt;td style=&quot;width: 52.7907%;&quot;&gt;남은 기둥 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 이중 연결 리스트&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1 연결 리스트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터를 배열처럼 순서대로 저장하지만 각 데이터가 다음 데이터를 직접 가리키는 구조&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열은 인덱스로 접근하지만, 연결 리스트는 노드끼리 연결&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-2 이중 연결 리스트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 노드가 두방향을 기억&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 이전&amp;nbsp;노드&amp;nbsp;&amp;larr;&amp;nbsp;현재&amp;nbsp;노드&amp;nbsp;&amp;rarr;&amp;nbsp;다음&amp;nbsp;노드&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-3 Node 클래스&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352213054&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node&amp;lt;E&amp;gt;{
	private E data;    
	private Node&amp;lt;E&amp;gt; prev;  
	private Node&amp;lt;E&amp;gt; next; 	
    
	Node(){
		data = null;
		prev = this;
		next = this;
	}
	Node(E obj, Node&amp;lt;E&amp;gt; prev, Node&amp;lt;E&amp;gt; next){
		data = obj;
		this.prev = prev;
		this.next = next;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.8605%;&quot;&gt;필드&lt;/td&gt;
&lt;td style=&quot;width: 58.0233%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.8605%;&quot;&gt;data&lt;/td&gt;
&lt;td style=&quot;width: 58.0233%;&quot;&gt;실제 저장할 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.8605%;&quot;&gt;prev&lt;/td&gt;
&lt;td style=&quot;width: 58.0233%;&quot;&gt;이전 노드 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.8605%;&quot;&gt;next&lt;/td&gt;
&lt;td style=&quot;width: 58.0233%;&quot;&gt;다음 노드 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-4 head, crnt&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352351375&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private Node&amp;lt;E&amp;gt; head;
private Node&amp;lt;E&amp;gt; crnt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.6279%;&quot;&gt;변수&lt;/td&gt;
&lt;td style=&quot;width: 58.2558%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.6279%;&quot;&gt;head&lt;/td&gt;
&lt;td style=&quot;width: 58.2558%;&quot;&gt;리스트의 시작을 관리하는 더미 노드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.6279%;&quot;&gt;crnt&lt;/td&gt;
&lt;td style=&quot;width: 58.2558%;&quot;&gt;현재 선택된 노드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-5 리스트가 비었는지 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352414277&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean isEmpty() {
    return head.next == head;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- head.next 가 head라면 중간에 데이터 노드가 없다는 것&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;head &amp;rarr; head&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;상태이면 리스트가 비어있다는 것&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-6 데이터 추가&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352503221&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void add(E obj) {
    Node&amp;lt;E&amp;gt; node = new Node&amp;lt;E&amp;gt;(obj,crnt,crnt.next);
    crnt.next = crnt.next.prev = node;
    crnt = node;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&lt;b&gt;4-7 맨 앞 / 맨 뒤 추가&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352556674&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void addFirst(E obj) {
    crnt = head;
    add(obj);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- head 바로 뒤에 추가하므로 첫번째 위치로 들어감&lt;/p&gt;
&lt;pre id=&quot;code_1779352583165&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void addLast(E obj) {
    crnt = head.prev;
    add(obj);
}&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;&lt;b&gt;4-8 노드 삭제&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352624570&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void removeCrnt() {
    if(!isEmpty()) {
        crnt.prev.next = crnt.next;
        crnt.next.prev = crnt.prev;
        crnt = crnt.prev;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;span&gt;앞 노드와 뒤 노드를 서로 연결해서 &lt;/span&gt;&lt;span&gt;삭제할 노드를 연결 구조에서 제외&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;4-9 전체 삭제&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352702400&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void clear() {
    while(!isEmpty()) {
        removeFirst();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리스트가 빌 때까지 첫 번째 노드를 계속 삭제&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. stack&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마지막에 넣은 데이터가 먼저 나오는 방식의 자료 구조 (LIFO)&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-1 stack 필드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779352770418&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int[] s;
private int capacity;
private int ptr;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열을 이용하여 정수 데이터 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%;&quot;&gt;필드&lt;/td&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%;&quot;&gt;s&lt;/td&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;데이터 저장 배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%;&quot;&gt;capacity&lt;/td&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;스택 최대 용량&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%;&quot;&gt;ptr&lt;/td&gt;
&lt;td style=&quot;width: 60%;&quot;&gt;현재 저장된 데이터 개수이자 다음 저장 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-2 push()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스택에 데이터를 추가하는 기능&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779352850880&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int push(int no) throws Exception {
    if(ptr&amp;gt;= capacity) {
        System.out.println(&quot;[스택이 가득 참]&quot;);
        throw new Exception();
    }
    return s[ptr++] = no;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ptr 위치에 값을 넣고 ptr을 1 증가시킴&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-3 pop()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가장 마지막에 넣은 데이터를 꺼냄&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779352899300&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int pop() throws Exception {
    if(ptr &amp;lt;= 0) {
        System.out.println(&quot;[스택이 비었음]&quot;);
        throw new Exception();
    }
    int res = s[--ptr];
    return res;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ptr을 먼저 1 줄이고, 그 위치의 데이터를 꺼냄 (배열의 인덱스는 0부터 시작)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-4 peek()&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터를 꺼내지는 않고 맨 위 데이터를 확인만 함&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779352955543&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int peek() throws Exception {
    if(ptr &amp;lt;= 0) {
        System.out.println(&quot;[스택이 비었음]&quot;);
        throw new Exception();
    }
    return s[ptr-1];
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. Queue&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;먼저 넣은 데이터가 먼저 나오는 자료구조(FIFO)&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1 Queue 필드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779353623952&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int[] q;
private int capacity;
private int num;
private int front;
private int rear;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.1628%;&quot;&gt;필드&lt;/td&gt;
&lt;td style=&quot;width: 63.8372%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.1628%;&quot;&gt;q&lt;/td&gt;
&lt;td style=&quot;width: 63.8372%;&quot;&gt;데이터 저장 배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.1628%;&quot;&gt;capacity&lt;/td&gt;
&lt;td style=&quot;width: 63.8372%;&quot;&gt;큐 최대 용량&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.1628%;&quot;&gt;num&lt;/td&gt;
&lt;td style=&quot;width: 63.8372%;&quot;&gt;현재 저장된 데이터 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.1628%;&quot;&gt;front&lt;/td&gt;
&lt;td style=&quot;width: 63.8372%;&quot;&gt;가장 앞 데이터 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.1628%;&quot;&gt;rear&lt;/td&gt;
&lt;td style=&quot;width: 63.8372%;&quot;&gt;다음 데이터가 들어갈 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2 enqueue()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;큐에 데이터를 추가하는 기능&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779353656693&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int enqueue(int no) throws Exception {
    if(num&amp;gt;=capacity) {
        System.out.println(&quot;[큐가 가득참]&quot;);
        throw new Exception();
    }
    q[rear++] = no;
    num++;

    if(rear == capacity) {
        rear = 0;
    }
    return no;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 rear 위치에 들어가고, rear은 다음 위치로 이동&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-3 dequeue()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가장 먼저 들어온 데이터를 꺼냄&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779353691132&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int dequeue() throws Exception {
    if(num &amp;lt;= 0) {
        System.out.println(&quot;[큐가 비었다]&quot;);
        throw new Exception();
    }

    int val = q[front++];
    num--;

    if(front == capacity) {
        front = 0;
    }

    return val;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 front 위치에서 꺼내고, front는 다음 위치로 이&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-4 원형 큐&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779353764117&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(rear == capacity) {
    rear = 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779353770149&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(front == capacity) {
    front = 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 끝까지 갔을 경우 다시 0번 인덱스로 돌아감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 일직선이 아니라 동그랗게 이어진 것처럼 사용&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. Stack / Queue 차이&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;Stack&lt;/td&gt;
&lt;td&gt;Queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구조&lt;/td&gt;
&lt;td&gt;마지막 데이터가 먼저 나옴&lt;/td&gt;
&lt;td&gt;먼저 넣은 데이터가 먼저 나옴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;방식&lt;/td&gt;
&lt;td&gt;LIFO&lt;/td&gt;
&lt;td&gt;FIFO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비유&lt;/td&gt;
&lt;td&gt;접시 쌓기&lt;/td&gt;
&lt;td&gt;줄 서기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추가&lt;/td&gt;
&lt;td&gt;push&lt;/td&gt;
&lt;td&gt;enqueue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;삭제&lt;/td&gt;
&lt;td&gt;pop&lt;/td&gt;
&lt;td&gt;dequeue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;확인&lt;/td&gt;
&lt;td&gt;peek&lt;/td&gt;
&lt;td&gt;peek&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>FullStack Study/9주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/41</guid>
      <comments>https://lemonpang777.tistory.com/41#entry41comment</comments>
      <pubDate>Fri, 22 May 2026 08:46:56 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 39일차 - JDBC (MVC 패턴)</title>
      <link>https://lemonpang777.tistory.com/40</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. MVC 심화 구조&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1 기존 방식 &lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기능 + 구현코드 (한 클래스에 작성)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 관리 어려움&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 수정 어려움&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779271150374&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberDao {

    public List&amp;lt;Member&amp;gt; selectAll(Connection con){
        // SQL 실행 코드
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Interface&amp;nbsp; - impl 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MemberDao&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;larr; 인터페이스 (기능 정의)&lt;br /&gt;MemberDaoImpl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;larr; 실제 구현 클래스 (실제 구현)&lt;br /&gt;&lt;br /&gt;MemberService&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;larr; 인터페이스 (기능 정의)&lt;br /&gt;MemberServiceImpl &amp;larr; 실제 구현 클래스 (실제 구현)&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Interface&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기능의 규칙을 미리 정의하는 것&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779270457487&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MemberDao{

public List&amp;lt;Member&amp;gt; selectAll(Connection con);

public Member selectOne(Connection con, int n);

public int insert(Connection con, Member m);

public int update(Connection con, Member m);

public int delete(Connection con, int n);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; 기능&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.&amp;nbsp; Impl 클래스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터페이스에서 정의한 기능을 실제 구현하는 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779271233326&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberDaoImpl implements MemberDao{
	public int insert(Connection con, Member m) {
	String sql = &quot; INSERT INTO MEMBER VALUES(SEQ_MEMBER.NEXTVAL, ?,?,?,?,?,?,?) &quot;;

	// SQL 실행 코드
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Interface - Impl 구조 사용 이유&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-1 역할 분리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터페이스 (규칙 정의), Impl (실제 구현) 분리&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-2 유지보수 쉬움&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB 구조가 변경되어도 인터페이스는 그대로 두고 Impl만 수정&amp;nbsp; 가능&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-3 코드 교체 쉬움&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB가 Oracle 에서 MySQL로 변경되어도 Impl만 바꿔도 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. SQL문 상수화&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1779269128079&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String selectAll = &quot; SELECT * FROM MEMBER &quot;;
String selectOne = &quot; SELECT * FROM MEMBER WHERE M_NO = ? &quot;;
String insert = &quot; INSERT INTO MEMBER VALUES(SEQ_MEMBER.NEXTVAL, ?,?,?,?,?,?,?) &quot;;
String update = &quot; UPDATE MEMBER SET M_LOCATION = ?, M_JOB = ?, M_TEL = ? WHERE M_NO = ? &quot;;
String delete = &quot; DELETE MEMBER WHERE M_NO = ? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL 수정 시 한 곳만 변경함으로 전체 수정 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL 관리 편함&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1 기존 방식&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779278592141&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pstm = con.prepareStatement(&quot; SELECT * FROM MEMBER &quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL 직접 작성&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2 상수화 방식&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779278629317&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pstm = con.prepareStatement(selectAll);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수처럼 재사용 가능&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 기존 Controller&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존에는 기능별로 Controller을 따로 구현&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779270761018&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MemberInsertController
MemberSelectController
MemberDeleteController&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클래스 관리 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; 중복 코드 증가&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 통합 Controller&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기능을 하나의 Controller로 통합&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779279903994&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public Object doMethod(Object ... obj) {
    String req = (String) obj[0];

    if(req.equals(&quot;selectAll&quot;)) {
        List&amp;lt;Member&amp;gt; res = s.selectAll();
        return res;

    } else if(req.equals(&quot;selectOne&quot;)) {
        int no = (int) obj[1];
        Member res = s.selectOne(no);
        return res;

    } else if(req.equals(&quot;insert&quot;)) {
        Member m = (Member) obj[1];
        int res = s.insert(m);
        return res;
    }

    return null;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Controller 클래스 하나로 여러 기능 처리 가능&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. 가변인자&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;매개 변수 개수를 자유롭게 받을 수 있는 문법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779270135512&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public Object doMethod(Object ... obj)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-1 가변인자 사용하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;통합 Controller에서는 기능마다 필요한 값 개수가 다르기 때문&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; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;기능&lt;/td&gt;
&lt;td style=&quot;width: 62.4419%;&quot;&gt;필요한 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;전체 조회&lt;/td&gt;
&lt;td style=&quot;width: 62.4419%;&quot;&gt;&quot;selectAll&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;선택 조회&lt;/td&gt;
&lt;td style=&quot;width: 62.4419%;&quot;&gt;&quot;selectOne&quot;, 회원 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;추가&lt;/td&gt;
&lt;td style=&quot;width: 62.4419%;&quot;&gt;&quot;insert&quot;, Member 객체&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체 조회&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779280086484&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;con.doMethod(&quot;selectAll&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선택 조회&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779280081119&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;con.doMethod(&quot;selectOne&quot;, inputNo());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779280076126&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;con.doMethod(&quot;insert&quot;, inputMember());&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. req 기능 구분&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1779280111116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String req = (String)obj[0];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 첫 번째 값에 기능 이름 저장&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779280132130&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;selectAll&quot;
&quot;insert&quot;
&quot;delete&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>FullStack Study/9주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/40</guid>
      <comments>https://lemonpang777.tistory.com/40#entry40comment</comments>
      <pubDate>Thu, 21 May 2026 12:39:57 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 38일차 - JDBC (MVC 패턴)</title>
      <link>https://lemonpang777.tistory.com/39</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JDBC MVC 패턴&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. MVC 패턴&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로그램을 역할별로 나누어 관리하는 구조&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; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.1628%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 58.7209%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.1628%;&quot;&gt;M(Model)&lt;/td&gt;
&lt;td style=&quot;width: 58.7209%;&quot;&gt;데이터 / DB 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.1628%;&quot;&gt;V(View)&lt;/td&gt;
&lt;td style=&quot;width: 58.7209%;&quot;&gt;화면 / 사용자 입력 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.1628%;&quot;&gt;C(Controller)&lt;/td&gt;
&lt;td style=&quot;width: 58.7209%;&quot;&gt;중간 연결 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. MVC 패턴 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;View&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Controller&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Service&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;DAO&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;DB&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;클래스&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;Run&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;프로그램 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;View&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;사용자 입력 / 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;Controller&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;View와 Service 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;Service&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;비즈니스 로직 / commit / rollback 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;DAO&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;실제 SQL 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;VO(Product)&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;데이터 저장 객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 41.9767%;&quot;&gt;JDBCTemplate&lt;/td&gt;
&lt;td style=&quot;width: 57.907%;&quot;&gt;공통 JDBC 기능 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Run 클래스&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로그램의 시작 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779176102208&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Run {
    public static void main(String[] args) {
        new ProductView().menu();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ProductView 객체를 생성하고 menu 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그램이 시작되면 가장 먼저 사용자 메뉴 화면으로 이동&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. ProductView 클래스&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자가 직접 보는 화면 역할&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 메뉴 출력&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 사용자 입력 받기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Controller 호출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 결과 출력&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779176358780&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private ProductController controller = new ProductController();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- View는 DB에 직접 접근하지 않고 Controller에 요청&lt;/p&gt;
&lt;pre id=&quot;code_1779178557996&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Product&amp;gt; resAll = controller.selectAll();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 조회 시 사용&lt;/p&gt;
&lt;pre id=&quot;code_1779178576311&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;controller.insert(insertProduct());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 추가 시 사용자가 입력한 정보를 Product 객체로 만들어 Controller에 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;View는 SQL을 실행하지 않고 사용자 입력과 출력만 담당&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. ProductController&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;View와 Service 사이를 연결&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779176474131&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int insert(Product dto) {
    return service.insert(dto);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- View에서 받은 요청을 Service로 전달하고, Service 결과를 다시 View로 돌려줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중간 전달자 역할&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;View 요청 받기&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Service에게 전달&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Service 결과를 View로 반환&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. ProductService&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB 작업 흐름을 관리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Connection 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- DAO 호출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 성공 시 commit, 실패 시 rollback&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- connection 종료&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779176584326&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int insert(Product dto) {
    Connection con = getConnection();
    int res = dao.insert(con, dto);

    if(res &amp;gt; 0) {
        commit(con);
    } else {
        rollback(con);
    }

    close(con);
    return res;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. DB 연결 생성&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2. DAO에게 insert 작업 요청&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3. 결과가 1 이상이면 commit&lt;/span&gt;&lt;br /&gt;&lt;span&gt;4. 실패하면 rollback&lt;/span&gt;&lt;br /&gt;&lt;span&gt;5. DB 연결 종료&lt;/span&gt;&lt;br /&gt;&lt;span&gt;6. 결과 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; SQL 실행은 DAO에게 맡기고, Service는 성공 여부에 따라 commit / rollback을 처리&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. ProductDao &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제 SQL을 작성하고 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779176657427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; INSERT INTO PRODUCT VALUES(?,?,?,?) &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;? 는 나중에 값이 들어가는 자리&lt;/p&gt;
&lt;pre id=&quot;code_1779176690954&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pstm = con.prepareStatement(sql);
pstm.setString(1, dto.getPid());
pstm.setString(2, dto.getPname());
pstm.setInt(3, dto.getPrice());
pstm.setString(4, dto.getDes());
		
res = pstm.executeUpdate();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- executeUpdate()로 INSERT, UPDATE, DELETE 같은 데이터 변경 SQL을 실행&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. Product VO&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB 데이터를 저장하는 객체&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779176767170&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private String pid;
private String pname;
private int price;
private String des;

public Product(String pid, String pname, int price, String des) {
		super();
		this.pid = pid;
		this.pname = pname;
		this.price = price;
		this.des = des;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. JDBCTemplate&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JDBC에서 반복되는 코드를 모아둔 공통 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- getConnection() : DB와 연결&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- close() : DB 연결 종료&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- commit : DB 변경 사항 저장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- rollback : DB 변경 사 취소&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779178863048&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Connection con = getConnection();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Service 클래스에서 DB 연결을 만들 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1779178892883&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;commit(con);
rollback(con);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업 성공 시 commit, 작업 실패 시 rollback 사용&lt;/p&gt;
&lt;pre id=&quot;code_1779178935800&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;close(con);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업 종료 시 Connection 종료&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. 전체 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10-1 전체 조회 흐름&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사용자 조회 요청&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ProductView에서 controller.selectAll() 호출&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ProductController에서 service.selectAll() 호출&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ProductService에서 DB 연결 생성&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ProductService에서 dao.selectAll(con) 호출&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ProductDao에서 SELECT 실행&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;조회 결과를 Product 객체로 변환&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Product 객체들을 List에 담아 반환&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;View에서 List를 출력&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779178985643&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; SELECT * FROM PRODUCT &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAO 에서 실행하는 SQL&lt;/p&gt;
&lt;pre id=&quot;code_1779179007405&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Product&amp;gt; res = new ArrayList&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조회 결과가 여러 개일 수 있기에 List&amp;lt;Product&amp;gt;에 담음&lt;/p&gt;
&lt;pre id=&quot;code_1779179037536&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(rs.next()) {
    Product p = new Product(
        rs.getString(1),
        rs.getString(2),
        rs.getInt(3),
        rs.getString(4)
    );

    res.add(p);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조회 결과 한 줄을 Product 객체 하나로 만들고, 그 객체를 List에 저장&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10-2 INSERT 흐름&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사용자가 제품 ID, 이름, 가격, 설명 입력&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;View에서 Product 객체 생성&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;View에서 controller.insert(product) 호출&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Controller에서 service.insert(product) 호출&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Service에서 DB 연결 생성&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;DAO에서 INSERT 실행&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;성공하면 Service에서 commit&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;실패하면 Service에서 rollback&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;결과를 View로 반환&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;View에서 성공/실패 메시지 출력&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779179121367&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return new Product(id, name, price, des);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- View에서 사용자가 입력한 값을 Product 객체로 만&lt;/p&gt;
&lt;pre id=&quot;code_1779179145807&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; INSERT INTO PRODUCT VALUES(?,?,?,?) &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAO에서 INSERT SQL문을 실행&lt;/p&gt;
&lt;pre id=&quot;code_1779179175922&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res = pstm.executeUpdate();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- res가 1 이상(수정된 줄이 1줄 이상)이면 성공&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10-3 UPDATE 흐름&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정할&amp;nbsp;제품&amp;nbsp;선택 &lt;br /&gt;&amp;darr; &lt;br /&gt;변경할&amp;nbsp;값&amp;nbsp;입력 &lt;br /&gt;&amp;darr; &lt;br /&gt;&lt;span&gt;View에서 Product 객체 생성&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Controller &amp;rarr; Service &amp;rarr; DAO 순서로 전달&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;DAO에서 UPDATE 실행&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;성공하면 commit&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;실패하면 rollback&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;View에서 결과 출력&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779179221695&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; UPDATE PRODUCT SET PRICE = ? WHERE P_ID = ? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAO에서 UPDATE SQL문 실행&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10-4 DELETE 흐름&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제할&amp;nbsp;제품&amp;nbsp;선택 &lt;br /&gt;&amp;darr; &lt;br /&gt;&lt;span&gt;View에서 controller.delete(id) 호출&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Controller에서 service.delete(id) 호출&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Service에서 DB 연결 생성&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;DAO에서 DELETE 실행&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;성공하면 commit&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;실패하면 rollback&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;View에서 결과 출력&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779179254547&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; DELETE PRODUCT WHERE P_ID = ? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAO에서 DELETE SQL문 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FullStack Study/9주차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/39</guid>
      <comments>https://lemonpang777.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 20 May 2026 08:44:57 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 37일차 - JDBC2</title>
      <link>https://lemonpang777.tistory.com/38</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. JDBCTemplate&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JDBC에서 반복되는 코드를 따로 모아두는 클래스 (반복되는 코드를 따로 빼기)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 JDBC는&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779075691738&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Class.forName(...)

DriverManager.getConnection(...)

con.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위 코드들을 항상 적어야 하기 때문에 코드가 길어지기에 이를 해결하기 위한 클래스&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1 JDBCTemplate 안에 포함되는 기능&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45%;&quot;&gt;기능&lt;/td&gt;
&lt;td style=&quot;width: 54.8837%;&quot;&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45%;&quot;&gt;getConnection()&lt;/td&gt;
&lt;td style=&quot;width: 54.8837%;&quot;&gt;DB 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45%;&quot;&gt;close()&lt;/td&gt;
&lt;td style=&quot;width: 54.8837%;&quot;&gt;연결 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. getConnection()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Oracle DB 연결 생성 메소드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779075757449&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static Connection getConnection()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 드라이버 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DB 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Auto Commit 설정&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1 getConnection() 전체 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779093251706&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class JDBCTemplate {

    // 1. DB 연결 메소드
    // 다른 클래스에서 getConnection()을 호출하면
    // Oracle DB와 연결된 Connection 객체를 반환해준다.
    public static Connection getConnection() {

        // Connection 객체를 담을 변수
        Connection con = null;

        // 1-1. Oracle JDBC 드라이버 등록
        try {
            Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
            // Java가 Oracle DB와 연결할 수 있도록 드라이버를 불러오는 코드
        } catch (ClassNotFoundException e) {
            System.out.println(&quot;[Error] 드라이버 등록 실패&quot;);
            e.printStackTrace();
        }

        // 1-2. DB 연결 정보
        String url = &quot;jdbc:oracle:thin:@localhost:1521/orcl&quot;;
        String id = &quot;ID&quot;;
        String pw = &quot;PW&quot;;

        // 1-3. DB 연결
        try {
            con = DriverManager.getConnection(url, id, pw);
            // url, id, pw를 이용해서 DB에 접속

            con.setAutoCommit(false);
            // 자동 커밋 해제
            // INSERT, UPDATE, DELETE 후
            // 직접 commit() 또는 rollback() 하기 위해 설정

        } catch (SQLException e) {
            System.out.println(&quot;[Error] 오라클 연결 실패&quot;);
            e.printStackTrace();
        }

        // 1-4. 연결된 Connection 객체 반환
        return con;
    }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2 Auto Commit&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동 저장 기능 활성화 여부&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779093434161&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;con.setAutoCommit(false);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;false : 비활성화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true : 활성화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 commit, rollback 처리 가능&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. close()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 끝난 DB 연결 종료&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779076595016&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void close(Connection con)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connection 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Statement 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ResultSet 종료&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1 close() 전체 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779093538459&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class JDBCTemplate {
    // 2. Connection 종료 메소드
    // DB 연결 종료
    public static void close(Connection con) {
        try {
            if(con != null) {
                con.close();
            }
        } catch (SQLException e) {
            System.out.println(&quot;[Error] con close 실패&quot;);
            e.printStackTrace();
        }
    }

    // 3. Statement 종료 메소드
    // SQL 실행 도구 종료
    public static void close(Statement stmt) {
        try {
            if(stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            System.out.println(&quot;[Error] stmt close 실패&quot;);
            e.printStackTrace();
        }
    }

    // 4. ResultSet 종료 메소드
    // SELECT 결과 저장 객체 종료
    public static void close(ResultSet rs) {
        try {
            if(rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            System.out.println(&quot;[Error] rs close 실패&quot;);
            e.printStackTrace();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 다른 클래스에서 사용&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1 static import&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 다른 클래스의 static 메소드를 클래스명 없이 바로 사용할 수 있게 해주는 기능&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779076656589&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import static common.JDBCTemplate.*;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클래스명 없이 메소드 사용 가능&lt;/p&gt;
&lt;pre id=&quot;code_1779093612887&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;getConnection();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;해당 형식으로 클래스명을 생략하여 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4-2 static 없이 import&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1779093797609&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import common.JDBCTemplate.*;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1779093810648&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JDBCTemplate.getConnection();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 앞에 클래스명이 항상 붙여야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. executeUpdate()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터를 추가, 수정, 삭제하기 위해 사용하는 기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779076691491&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int res = stmt.executeUpdate(sql);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- res에 SQL 실행 결과로 몇 개의 행이 영향을 받았는지 저장&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-2 executeQuery()와 executeUpdate() 차이&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;메소드&lt;/td&gt;
&lt;td&gt;사용 SQL&lt;/td&gt;
&lt;td&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;executeQuery()&lt;/td&gt;
&lt;td&gt;SELECT&lt;/td&gt;
&lt;td&gt;ResultSet 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;executeUpdate()&lt;/td&gt;
&lt;td&gt;INSERT, UPDATE, DELETE&lt;/td&gt;
&lt;td&gt;int 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SELECT 일 때&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조회 결과가 필요하기에 ResultSet으로 결과를 받는다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779094404257&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ResultSet rs = stmt.executeQuery(sql);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;INSERT 일 때&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;몇 행이 추가되었는지 확인하기 때문에 int로 결과를 받는다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779094411509&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int res = stmt.executeUpdate(sql);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-3&lt;/b&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;executeUpdate()&lt;span&gt; 반환&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779094468929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(res &amp;gt; 0) {
    System.out.println(&quot;insert 성공&quot;);
} else {
    System.out.println(&quot;insert 실패&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;res 반환값으로 추가/수정/삭제 성공 여부 출력 가능&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. PreparedStatement&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SQL문을 미리 준비하고, 값을 나중에 넣는 방식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779094598293&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; INSERT INTO MYTEST VALUES(?,?,?) &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ? 는 나중에 값을 넣을 자리&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7.&amp;nbsp; PreparedStatement 사용 순서&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-1 SQL 작성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779094659464&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; INSERT INTO MYTEST VALUES(?,?,?) &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-2 PreparedStatement 생성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779094668564&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pstm = con.prepareStatement(sql);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-3 ?에 값 넣기&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779094680078&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pstm.setInt(1, no);
pstm.setString(2, name);
pstm.setString(3, nickName);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-4 실행&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779094696193&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int res = pstm.executeUpdate();&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. Statement와 PreparedStatement 비교&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Statement&lt;/td&gt;
&lt;td&gt;PreparedStatement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL 작성&lt;/td&gt;
&lt;td&gt;문자열 직접 연결&lt;/td&gt;
&lt;td&gt;? 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;값 넣기&lt;/td&gt;
&lt;td&gt;문자열에 직접 포함&lt;/td&gt;
&lt;td&gt;setInt(), setString()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가독성&lt;/td&gt;
&lt;td&gt;복잡함&lt;/td&gt;
&lt;td&gt;깔끔함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실수 가능성&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보안&lt;/td&gt;
&lt;td&gt;상대적으로 취약&lt;/td&gt;
&lt;td&gt;더 안전함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. Delete&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테이블에서 데이터를 삭제하는 SQL&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779104547153&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sql = &quot; DELETE FROM MYTEST WHERE MNAME=? &quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-1 PreparedStatement로 DELETE 실행&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779104576300&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String name = new Scanner(System.in).next();

pstm = con.prepareStatement(sql);
pstm.setString(1, name);

int res = pstm.executeUpdate();&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;1. 사용자가 이름 입력&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. ? 자리에 이름 넣기&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3. DELETE 실행&lt;/span&gt;&lt;br /&gt;&lt;span&gt;4. 삭제된 행 개수 반환&lt;/span&gt;&lt;/p&gt;</description>
      <category>FullStack Study/9주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/38</guid>
      <comments>https://lemonpang777.tistory.com/38#entry38comment</comments>
      <pubDate>Tue, 19 May 2026 08:59:55 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 풀스택 36일차 - Oracle DB 6 / JDBC</title>
      <link>https://lemonpang777.tistory.com/37</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Oracle DB&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. INDEX (인덱스)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터를 더 빨리 찾기 위한 기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 검색 속도 향상용 기능&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1 장점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 검색 속도 향상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- SELECT 성능 개선&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2 단점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- &lt;/b&gt;&lt;b&gt;데이터를 수정할 때마다 다시 계산해야 함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 저장 공간 추가 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-3 인덱스 정보 조회&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816289749&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM USER_IND_COLUMNS;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 고유 인덱스 (UNIQUE INDEX)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중복 없는 값&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816318911&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE UNIQUE INDEX IDX_EMP_NO
ON EMPLOYEE(EMP_NO);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중복값 허용 안함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PRIMARY KEY / UNIQUE 생성 시 오라클이 자동 생성하기도 함&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 일반 INDEX&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자주 조회하는 컬럼 기준 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816376043&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE INDEX IDX_DEPT_CODE
ON EMPLOYEE(DEPT_CODE);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. INDEX 삭제&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1778816394008&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DROP INDEX IDX_DEPT_CODE;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. PL / SQL&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오라클의 절차형 프로그래밍 언어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- SQL 안에서 변수, 조건문, 반복문 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-1 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 변수 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 조건문 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 반복문 사용 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 예외 처리 가능&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-2 PL/SQL 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816457266&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
BEGIN
EXCEPTION
END;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.3256%;&quot;&gt;영역&lt;/td&gt;
&lt;td style=&quot;width: 52.5581%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.3256%;&quot;&gt;DECLARE&lt;/td&gt;
&lt;td style=&quot;width: 52.5581%;&quot;&gt;변수 선언&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.3256%;&quot;&gt;BEGIN&lt;/td&gt;
&lt;td style=&quot;width: 52.5581%;&quot;&gt;실행 영역&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.3256%;&quot;&gt;EXCEPTION&lt;/td&gt;
&lt;td style=&quot;width: 52.5581%;&quot;&gt;예외 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.3256%;&quot;&gt;END&lt;/td&gt;
&lt;td style=&quot;width: 52.5581%;&quot;&gt;종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-3 예외 처리&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816490834&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EXCEPTION
WHEN 예외명
THEN 실행코드;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1778816496956&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN DBMS_OUTPUT.PUT_LINE('이미 존재');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중복 값 오류 발생 시 메시지 출력&lt;/p&gt;
&lt;h3 data-end=&quot;2174&quot; data-start=&quot;2150&quot; data-section-id=&quot;pezka9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-4 DBMS_OUTPUT.PUT_LINE()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 함수&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816534347&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DBMS_OUTPUT.PUT_LINE('HELLO');&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-5 변수 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;값을 저장하는 공간&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816617461&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE
	vid NUMBER;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5-6 SELECT INTO&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조회 결과를 변수에 저장&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816649251&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMP_ID
INTO vid
FROM EMPLOYEE
WHERE EMP_NAME='레몬팡';&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. %TYPE / %ROWTYPE &lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-1 %TYPE&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컬럼 자료형 그대로 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778833791948&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ID EMPLOYEE.EMP_ID%TYPE;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EMP_ID와 같은 타입으로 변수 생성&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6-2 %ROWTYPE&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테이블 한줄 전체 저장&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778833818099&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;myrow EMPLOYEE%ROWTYPE;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EMPLOYEE 한 행 전체 저장 가능&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. IF문&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 조건에 따라 다르게 실행 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816684043&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IF 조건 THEN
	실행문
END IF;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-1 여러 조건&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816701495&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IF 조건1 THEN
ELSIF 조건2 THEN
ELSE
END IF;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7-2 ELSIF&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816738944&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IF 조건 THEN
	실행문
ELSIF 조건 THEN
	실행문
ELSE
	실행문
END IF;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. LOOP (반복문)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 같은 작업 여러 번 반복&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-1 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816765707&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LOOP
	반복내용
END LOOP;&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;&lt;b&gt;8-2 EXIT (종료)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조건 만족 시 종료&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816819242&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LOOP
	DBMS_OUTPUT.PUT_LINE(N);
 	N := N-1;
	IF N = 0 THEN 
		EXIT;
	END IF;
END LOOP;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-3 EXIT WHEN&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조건 만족 시 반복문 종료&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816855481&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LOOP
	DBMS_OUTPUT.PUT_LINE(N);
 	N := N-1;
	EXIT WHEN N=0;
END LOOP;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-4 FOR LOOP&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조건 반복문&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816890336&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOR N IN 1..5 LOOP
	DBMS_OUTPUT.PUT_LINE(N);
END LOOP;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-5 FOR문 INSERT&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816923061&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOR X IN 1..10 LOOP
	INSERT INTO TEST_FOR
	VALUES(X, CURRENT_DATE);
END LOOP;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-6 REVERSE&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778816966732&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOR X IN REVERSE 1..10 LOOP
	INSERT INTO TEST_FOR
	VALUES(X, CURRENT_DATE);
END LOOP;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;9. PROCEDURE (프로시저)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자주 사용하는 SQL을 저장하고 필요할 때 실행하는 기능&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-1 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778834488306&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
BEGIN
    실행할 코드
END;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&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: 50%;&quot;&gt;CREATE OR REPLACE&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;PROCEDURE&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;IS&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;BEGIN&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;END&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1778834593241&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 DEL_ALL_EMP
IS
BEGIN
    DELETE FROM EMP_TMP;
END;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DEL_ALL_EMP를 실행하면 EMP_TMP 테이블 전체 삭제&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9-2 실행 방법&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778834646862&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BEGIN
    DEL_ALL_EMP;
END;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1778834653662&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EXEC DEL_ALL_EMP;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;10. FUNCTION (함수)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;계산 후 결과값을 돌려주는 기능&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10-1 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778834691629&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 함수명(매개변수)
RETURN 자료형
IS
BEGIN
    실행 코드

    RETURN 값;
END;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1778834712415&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 BONUS_CALC(V_EMP_ID IN EMPLOYEE.EMP_ID%TYPE)
RETURN NUMBER
IS&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10-2 사용 방법&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778834764243&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMP_NAME, BONUS_CALC(EMP_ID)
FROM EMPLOYEE;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;11. 프로시저, 함수 차이&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;프로시저&lt;/td&gt;
&lt;td&gt;함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;작업 실행&lt;/td&gt;
&lt;td&gt;값 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETURN 없어도 됨&lt;/td&gt;
&lt;td&gt;RETURN 반드시 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;12. TRIGGER (트리거)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 일이 발생하면 자동 실행되는 기능&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;12-1 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778834844179&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 트리거명
실행시점
BEGIN
    실행 코드
END;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1778834876591&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 TRG_01
AFTER INSERT ON PRODUCT_DETAIL
FOR EACH ROW
BEGIN&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;12-1-1 AFTER INSERT &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- INSERT 이후 실행&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;12-1-2 ON PRODUCT_DETAIL&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- PRODUCT_DETAIL 테이블에서 발생 시 &lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;12-1-3 FOR EACH ROW&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;&lt;/b&gt;&lt;b&gt; 행 하나 추가될 때마다 실행 &lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;13. :NEW&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1778834962302&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:NEW.STATUS&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로 들어온 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방금 INSERT 된 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JDBC&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. JDBC&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JAVA와 DB를 연결해주는 기술&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java&amp;nbsp;프로그램&amp;nbsp;&amp;rarr;&amp;nbsp;Oracle&amp;nbsp;DB&amp;nbsp;접속&amp;nbsp;&amp;rarr;&amp;nbsp;SQL&amp;nbsp;실행&amp;nbsp;&amp;rarr;&amp;nbsp;결과&amp;nbsp;가져오기&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. JDBC 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1778994364979&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 드라이버 등록
Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);

// 2. DB 연결
Connection con = DriverManager.getConnection(url, id, pw);

// 3. SQL 실행
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);

// 4. 결과 처리
while(rs.next()) {
    ...
}

// 5. 종료
rs.close();
stmt.close();
con.close();&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1 드라이버 등록&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778994380851&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JAVA가 Oracle DB가 연결할 수 있게 불러오는 코드&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2 DB 연결&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778994430509&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String url = &quot;jdbc:oracle:thin:@localhost:1521/orcl&quot;;
String id = &quot;ID&quot;;
String pw = &quot;PW&quot;;

Connection con = DriverManager.getConnection(url, id, pw);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에 로그인하는 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- url : DB 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- id : DB 계정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- pw : DB 비밀번호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connection : DB와 연결된 통로&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-3 SQL 작성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778994509742&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Statement : SQL 실행 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ResultSet : SELECT 결과를 담는 상자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; executeQuery()는 SELECT문 실행 시 사용&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-4 결과 출력&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778994578163&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(rs.next()) {
    System.out.println(rs.getInt(1) + &quot;\t&quot; + rs.getString(2));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rs.next() : 결과를 한 줄씩 이동화면서 읽는 코드&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. ResultSet 값 꺼내기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1 컬럼 번호로 꺼내기&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778994667476&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rs.getInt(1)
rs.getString(2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rs.getInt(1) : 1번째 컬럼 꺼내기&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2 컬럼 이름으로 꺼내기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778994702322&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rs.getInt(&quot;SALARY&quot;)
rs.getString(&quot;DEPT_TITLE&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컬럼 이름으로 값을 꺼냄&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 연결 종료&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1778994745001&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rs.close();
stmt.close();
con.close();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;코드&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;Class.forName()&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;DB 드라이버 등록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;DriverManager.getConnection()&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;DB 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;Connection&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;DB 연결 통로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;Statement&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;SQL 실행 도구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;executeQuery()&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;SELECT 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;ResultSet&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;조회 결과 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;rs.next()&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;다음 행으로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;getString()&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;문자 데이터 꺼내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;getInt()&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;숫자 데이터 꺼내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 46.8605%;&quot;&gt;close()&lt;/td&gt;
&lt;td style=&quot;width: 53.0233%;&quot;&gt;자원 반납&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>FullStack Study/8주차</category>
      <category>멀티캠퍼스부트캠프</category>
      <category>부트캠프</category>
      <category>현대이지웰JAVA풀스택8회차</category>
      <author>레몬팡777</author>
      <guid isPermaLink="true">https://lemonpang777.tistory.com/37</guid>
      <comments>https://lemonpang777.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 17 May 2026 22:07:36 +0900</pubDate>
    </item>
  </channel>
</rss>