์ข์ ์คํ์์. ์ด ๊ธฐ์ฌ์์๋ ๊ฐ๋จํ CRUD ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ๋ ๊ณผ์ ์์ Maven, Spring, Hibernate, MySQL ๋ฐ Tomcat๊ณผ ๊ฐ์ ๊ฒ๋ค์ ์ฒ์ ์ ํ ๋ด์ฉ์ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ด ๋ง์ง๋ง ๋ถ๋ถ์
๋๋ค. ์ด ๊ธฐ์ฌ๋ ์ฃผ๋ก ์ฌ๊ธฐ์์ 30~40๊ฐ์ ๋ ๋ฒจ์ ์๋ฃํ์ง๋ง ์์ Java๋ฅผ ๋์ด์๋ ๋ชจํ์ ์์ง ์๋ํ์ง ์์์ผ๋ฉฐ ์ด๋ฌํ ๋ชจ๋ ๊ธฐ์ , ํ๋ ์์ํฌ ๋ฐ ๊ธฐํ ์ต์ํ์ง ์์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์คํ ์๋์ ์ง์
ํ๊ธฐ ์์ํ(๋๋ ๊ณง ์์ํ๋ ค๋) ์ฌ๋๋ค์ ๋์์ผ๋ก ํฉ๋๋ค. ๋จ์ด. ์ด๊ฒ์ "Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์
์๊ฐ" ๊ธฐ์ฌ์ ๋ง์ง๋ง ๋ค ๋ฒ์งธ ๋ถ๋ถ์
๋๋ค. ์ด์ ๋ถ๋ถ์ ๋ค์ ๋งํฌ๋ฅผ ํตํด ๋ณด์ค ์ ์์ต๋๋ค.
์ด๋ฌํ ํ์ผ์ ์ฌ์ฉํ๋ ค๋ฉด ๊ตฌ์ฑ์์ ํด๋น ์์น๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ ์์
์ ๊ฐ์
์์ ํฐ์น๋ฅผ ํ๋ ๋ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ปจํธ๋กค๋ฌ๋ก ๋์๊ฐ๋๋ค. ์ถ๊ฐ, ํธ์ง ๋ฐ ์ญ์ ๋ฉ์๋์์ ์์
์ด ์๋ฃ๋ ํ ๊ธฐ๋ณธ ํ์ด์ง "redirect:/" ๋ก ๋ฆฌ๋๋ ์
๋ฉ๋๋ค . ์ ๊ฒ. 50๋ฒ์งธ ํ์ด์ง ์ด๋๊ฐ์ ์๊ณ ํญ๋ชฉ ํธ์ง์ ํด๋ฆญํ๋ฉด ์คํ ํ " / " ์ฃผ์๋ก ์ด๋ํฉ๋๋ค. 1ํ์ด์ง๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๊ทธ๋ค์ง ํธ๋ฆฌํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์๋ ๊ณณ์ผ๋ก ๋์๊ฐ๊ณ ์ถ์ต๋๋ค. ์์ฃผ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํด๋ณด์. ํด๋์ค์
- Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์๊ฐ(1๋ถ)
- Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์๊ฐ(2๋ถ)
- Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์๊ฐ(3๋ถ)
์ฝํ ์ธ :
๋์์ธ ๋ฐ ์น ๋ฆฌ์์ค
์ฐ๋ฆฌ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ํ์ง๋ง ๋๋ฌผ, ์ง๋ฃจํ ๋น๋ฌธ, ๋ณด๊ธฐ ํํ ๋งํฌ, ๋น ํฐ์ ๋ฐฐ๊ฒฝ ์์ด๋ ๋ณผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ค๋ฅธ ์๋ฆ๋ค์์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ฐ์ , HTML ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ๊ฐ์ง๊ณ ๋๋ฉด์ ๋ชจ๋ ์ข ๋ฅ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค . ํ์ง๋ง HTML๋ง ์ฌ์ฉํ์ฌ ๋ฐฐ๊ฒฝ, ์์, ํฌ๊ธฐ, ์์ ๋ฐฐ์ด ๋ฑ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ฉด ๋ฑ๋ฑ. ๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ตญ ๋์ค์ ์๋ฌด๊ฒ๋ ์์๋ผ ์ ์์ ์ ๋๋ก ํ์ด์ง๋ฅผ ์๋ง์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ HTML์ ๋์์ธ ์ต์ ์ ๋งค์ฐ ์ ํ์ ์ ๋๋ค. ์ด๋ฅผ ์ํด์๋ CSS (Cascading Style Sheets)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋์์ธ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ํ ๊ณณ์ ๋ชจ์ ํ์ด์ง์ ์ํ๋ ์์์ ์ ์ฉํ ์ ์์ต๋๋ค. CSS ์ฝ๋๋ JSP ํ์ด์ง์ ํน์ ํ๊ทธ ์ ์ง์ ์์ฑํ ์๋ ์์ง๋ง, ๋ณ๋์ ํ์ผ์ ๋ฃ์ด์ ํ์ํ ํ์ด์ง์ ๊ฐ๋จํ ์ ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ํธ๋ฆฌํฉ๋๋ค. ์คํ์ผ ๋ฐ ๊ธฐํ ์ ์ ์น ๋ฆฌ์์ค๊ฐ ํฌํจ๋ ํ์ผ์ ๋ฐฐ์นํ๊ธฐ ์ํด webapp ๋ด์ ๋ณ๋์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค . ์น ๋ฆฌ์์ค๋ฅผ ์ผ๋ฐ ๋ฆฌ์์ค( db.properties๊ฐ ์๋ ๊ณณ)์ ํผ๋ํ์ง ์๊ธฐ ์ํด ์ด ๋๋ ํ ๋ฆฌ๋ฅผ res๋ผ๊ณ ๋ถ๋ฅด๊ณ ๋ชจ๋ CSS ํ์ผ, ์ด๋ฏธ์ง ๋ฑ์ ์ฌ๊ธฐ์ ๋ฐฐ์น ํ๊ฒ ์ต๋๋ค .WebConfig
. ์ด์ ์๋ ์ฃผ์์ ์ฌ์ฉํ์ฌ @EnableWebMvc
์๋ฌด๊ฒ๋ ๊ตฌ์ฑํ์ง ์๊ณ ๋จ์ํ ๊ธฐ๋ณธ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ต๋๋ค. ํ์ง๋ง ์ด์ ๋ญ๊ฐ๋ฅผ ๊ตฌ์ฑํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ์ํด WebMvcConfigurer
๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ์ฌ์ ์ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ๊ฒ. ๊ธฐ๋ณธ ๊ตฌ์ฑ์ ์ฌ์ฉํ ์ ์์ง๋ง ๋์์ ์ผ๋ถ ์ธก๋ฉด์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ addResourceHandlers
์ ์ ์น ๋ฆฌ์์ค์ ์์น๋ฅผ โโ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๋ง์ผ์ ๋๋นํด ์ ์ฒด ์์
์ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
package testgroup.filmography.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/res/**").addResourceLocations("/res/");
}
@Bean
ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
์ด์ ํ์ด์ง์์ CSS๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํ๊ทธ ๋ด๋ถ์ ๋งํฌํด์ผ ํฉ๋๋ค head
.
<head>
<link href="<c:url value="/res/style.css"/>" rel="stylesheet" type="text/css"/>
</head>
๋ค์ ์ค์ ์ถ๊ฐํ๊ณ ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ CSS ํ์ผ์ ๋ง๋์ธ์.
table {
border-spacing: 0 10px;
font: bold 100% Georgia, serif;
margin: 40px auto;
text-shadow: 5px 5px 5px #3F3F7F;
background: #B1B9D9;
text-align: center;
vertical-align: middle;
width: 50%;
border: 10px solid blue;
}
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ฐ๋ฆฌ์ ํ
์ด๋ธ์ ์์ ํ ๋ฐ๊ฟ ๊ฒ์
๋๋ค(๋ฌผ๋ก ์ด๋ฆฌ์์ด ๋ณด์ด์ง๋ง ์๋ฅผ ๋ค์ด ์ด๋ ์ต๋๋ค). CSS์ ๋ํด ์์ธํ ๋งํ ํ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์ธํฐ๋ท์์๋ ํ
์ด๋ธ๊ณผ ์์์ ๋์์ธํ๊ธฐ ์ํ ๊ธฐ์ฑ ์ต์
์ ๋ง์ด ์ฐพ์ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ฌผ๋ก ์ง์ ๋์์ธํ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๋ค. ๋์์ด๋๊ฐ ๋ ํ์๋ ์์ต๋๋ค. ๊ฒฐ๊ตญ ์ด๊ฒ์ ์ผ์ข
์ ๋ณต์กํ ์ฌ์ดํธ๊ฐ ์๋๋๋ค. ์ฒ์ ๋ง๋ ์ง ๋ช ์๊ฐ๋ง ์ง๋๋ฉด ์ด๋ ๊ฒ ๊ฐ๋จํ ํ์ด์ง์ ์๋นํ ์๋ฆ๋ต๊ณ ๊น๋ํ ๋์์ธ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ํ ์ธํฐ๋ท์ ๋ชจ๋ ์ข
๋ฅ์ ๊ฐ์์ ์์ ๋ก ๊ฐ๋ ์ฐจ ์์ผ๋ฉฐ, ํ ํ๋ฉด์์ HTML, CSS๋ฅผ ๋์์ ํธ์งํ๊ณ ๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์ฆ์ ํ์ธํ ์ ์๋ ํน์ ์ฌ์ดํธ๊ฐ ์์ต๋๋ค. ์ฝ๊ฐ์ ์ฐ์ต์ ํตํด ์ค์ ์์ ์ํ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ์ค, ์ฌ๊ธฐ์๋ ๋๋ฌด ํฅ๋ถํด์๋ ์ ๋ฉ๋๋ค(๋ฌผ๋ก ๋์์ด๋๊ฐ ๋ ๊ณํ์ด ์๋ค๋ฉด). ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ธ์ด ๊ทธ๋ฐ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ฃผ ์ค๋ซ๋์ ๊ฐํ ์ ์์ต๋๋ค. ์ฒ์ CSS๋ฅผ ์ดํดํ๊ธฐ ์์ํ์ ๋ ๋งํ์ต๋๋ค. ๋๋ ๋ชจ๋ ๊ฒ, ๋ชจ๋ ์์ฑ์ ์ํํด๋ณด๊ณ ์ถ์๊ณ , ๋ญ๊ฐ๋ฅผ ๋นํ๊ณ , ์๋ณด๊ณ , ์คํํ๊ณ , ์ผ๋ถ ์ฌ์ดํธ์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ ์์๋ณผ ์ ์์ ์ ๋๋ก ๋ค์ ๋ง๋ค๊ณ ์ถ์์ต๋๋ค. ์๋ง ์ด ์ฅ๋๊ฐ์ด ๋์์ง ๋๊น์ง ์ผ์ฃผ์ผ ๋์ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ์ฌ๋ฏธ์๊ฒ ๋์์ ๊ฒ์
๋๋ค. :) ๊ธ์์, ์ผ๋ฐ์ ์ผ๋ก ๊ณผ์ฉํด์ ์ดํดํ ์ ์๋ ๋ค์ฑ๋ก์ด ๊ธฐ์ ์ ๋ง๋ค์ด์๋ ์ ๋ฉ๋๋ค. ์ธ๋ จ๋๊ฒ. ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์๋ ์ ์ผํ ๊ฒ์
๋๋ค. CSS๋ ๋์์ธ์ ๋ํ ์ค๋ช
์ด๊ณ HTML์ ๋งํฌ์
์ด๋ผ๋ ๊ฒ์ ์ดํดํด์ผ ํฉ๋๋ค . CSS๋ฅผ ํตํด ์ ๋์ ์ผ๋ก ๋ชจ๋ ์์
์ ์ํํ๋ ค๊ณ ํด์๋ ์ ๋ฉ๋๋ค. ์ผ๋ถ ์ธก๋ฉด์ ์ํํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ณ ์ผ๋ถ๋ ๋จ์ํ ๋ถ๊ฐ๋ฅํฉ๋๋ค. HTML์์๋ ๋ช ์ค์ ์ถ๊ฐ ๋ผ์ธ ๋๋ ํ๊ทธ์ ๋จ ํ๋์ ์์ฑ๋ง ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๊ฒฐํฉํ๊ณ CSS๋ก ๋ชจ๋ ์ข
๋ฅ์ ์์, ๋ฐฐ๊ฒฝ, ๊ธ๊ผด์ ๋ง๋ค์ด์ผ ํ๋ฉฐ, ์๋ฅผ ๋ค์ด ๋ ๊ฐ์ ํ ์
์ ๊ฒฐํฉํด์ผ ํ๋ ๊ฒฝ์ฐ HTML ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ์๋ฅผ ๋ค์ด, CSS์ HTML์ ๋ง์ง์๊ฑฐ๋ฆฌ๋ฉฐ ๋ช ์๊ฐ ๋ง์ ํ์ด์ง์์ ํ ์ ์์๋ ์์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (์ด ์์
์ ์ํํ๊ธฐ ์ํด ๋ด๊ฐ ๋ง๋ ํผ๋์ ๋ํด์๋ ์ฌ๊ธฐ์์ ์์ธํ ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค. ๋ง์ง๋ง์๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์์ ๊ฒ์
๋๋ค. ๋ณผ ์ ์๋ ์ด ํ๋ก์ ํธ์ GitHub ๋งํฌ): ๋ฌผ๋ก ์ ๊ฐ ๊ฑฐ๊ธฐ์์ ๋ชจ๋ ์ผ์ ์ผ๋ง๋ ๋ฅ์ํ๊ฒ ํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ผ์ฃผ์ผ ์ ์ CSS๋ฅผ ์ฒ์ ๋ณธ ๊ฒ์ ์๊ฐํ๋ฉด ๊ฝค ์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ชฝ์ ๋งค๊ธฐ๊ธฐ
์ด์ ๋ชจ๋ ๊ฒ์ด ์๋ํ๊ณ ์ข์ ๋ณด์ด์ง๋ง ์ง๊ธ๊น์ง ํ ์ด๋ธ์๋ ๋ ์ฝ๋๊ฐ ๋ช ๊ฐ๋ง ์์ต๋๋ค. ๊ทธ ์์ ์ํ๊ฐ 100๊ฐ, 1000๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๊ทธ๋ ๊ฒ ๊ธด ๋ชฉ๋ก์ ์คํฌ๋กคํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ํธ๋ฆฌํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชฉ๋ก์ด 10๊ฐ ํญ๋ชฉ์ ํ์ด์ง๋ก ํ์๋๋ฉด ํจ์ฌ ๋ ํธ๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ๋ชฉ๋ก์ ํ์ด์ง๋ก ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค(๋๋๋ก ์ด๋ฅผ "ํ์ด์ง" ๋๋ "ํ์ด์ง ๋งค๊น"( ์์ด ํ์ด์ง ๋งค๊น )์ด๋ผ๊ณ ๋ ํจ). ์ด๊ฒ์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ํ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ ์ฒด ๋ชฉ๋ก์ jsp ํ์ด์ง๋ก ์ ์กํ๊ณ ํ์ํ ๋ ์ฝ๋ ์์ ๋ํ ํ ์ด๋ธ์ ์์ฑํ ์ ์์ต๋๋ค. ๋๋ ์๋ฅผ ๋ค์ด ์๋น์ค์ ์ผ๋ฐ ๋ชฉ๋ก์์ ํ์ํ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ ๋ค์ ์ด ๋ฏธ๋ ๋ชฉ๋ก์ jsp ํ์ด์ง๋ก ๋ณด๋ด ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฌผ๋ก ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ค์์ ์ํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์์ด๋์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ์ฒด ๋ชฉ๋ก์ ๊ฐ์ ธ์์ ์กฐ๊ฐ์ผ๋ก ๋๋๋ ๊ฒ์ด ์๋๋ผ ์ฒ์์๋ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ํ ์กฐ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค. ๊ฒฐ๊ตญ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ฐฑ, ์์ฒ ๊ฐ์ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ํ ๋ฒ์ ๊บผ๋ด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํ์ํ ๋ ์ฝ๋๊ฐ ์์ 10๊ฐ ์์ ์์ผ๋ฉด ์ด 10๊ฐ๋ง ๊บผ๋ด๋ ๊ฒ์ด ์ข์ต๋๋ค. DAO ๋ก ์ด๋ํ์ฌ ํ์ด์ง ๋ฒํธ๋ฅผ ๋ด๋นํ๋ ๋ฉ์๋์allFilms
๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค (๋ฌผ๋ก ์๋น์ค์์๋ ๋์ผํ ์์
์ ์ํํฉ๋๋ค). int page
๊ทธ๋ฆฌ๊ณ ์ด ๋ฉ์๋์ ๊ตฌํ์ ์ฝ๊ฐ ๋ณ๊ฒฝํด ๋ณด๊ฒ ์ต๋๋ค. ์ด์ ์ ์ ์ฒด ๋ชฉ๋ก์ ๊บผ๋๋ค๋ฉด ์ด์ ๋ ์ผ๋ถ๋ง ๊บผ๋ผ ๊ฒ์
๋๋ค. setFirstResult
๋ฐฉ๋ฒ (ํ
์ด๋ธ์์ ์์ํ ํ)๊ณผ setMaxResults
(ํ์ํ ๋ ์ฝ๋ ์)๋ ๋ค์๊ณผ ๊ฐ์ด ๋์์ด ๋ฉ๋๋ค .
@SuppressWarnings("unchecked")
public List<Film> allFilms(int page) {
Session session = sessionFactory.getCurrentSession();
return session.createQuery("from Film").setFirstResult(10 * (page - 1)).setMaxResults(10).list();
}
์ ๊ฒ๋ค. ์ฒซ ๋ฒ์งธ ํ์ด์ง์ธ ๊ฒฝ์ฐ 0๋ฒ์งธ๋ถํฐ ์ต๋ 10๊ฐ์ ๋ ์ฝ๋๋ฅผ ํ์ํ๊ณ , 5๋ฒ์งธ ํ์ด์ง์ธ ๊ฒฝ์ฐ 40๋ฒ์งธ๋ถํฐ ์์ํ์ฌ 10๊ฐ์ ๋ ์ฝ๋๋ฅผ ํ์ํฉ๋๋ค(๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฒํธ๋ 0๋ถํฐ ์์ํ๋ค๋ ์ ์ ์์ง ๋ง์ธ์). ๋ํ ํ
์ด๋ธ์ ๋ ์ฝ๋ ์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ ์ถ๊ฐ๋ก ์์ฑํ๊ฒ ์ต๋๋ค. ๋ชจ๋ ํ์ด์ง์ ์๋ฅผ ์๊ณ jsp ํ์ด์ง์ ๋ํ ๋งํฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ์ด๊ฒ์ด ํ์ํฉ๋๋ค.
public int filmsCount() {
Session session = sessionFactory.getCurrentSession();
return session.createQuery("select count(*) from Film", Number.class).getSingleResult().intValue();
}
int
์ด๋ฌํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๋ ์์ฒด๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ํ
์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋ ์๋ฅผ ๊ฐ์ผ๋ก ์ป์ ์ ์์ต๋๋ค . ์ด์ ์ปจํธ๋กค๋ฌ๋ก ์ด๋ํ์ฌ ์ํ ๋ชฉ๋ก์ด ํฌํจ๋ ๊ธฐ๋ณธ ํ์ด์ง๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์ ๋ํด ์์
ํด ๋ณด๊ฒ ์ต๋๋ค.
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView allFilms(@RequestParam(defaultValue = "1") int page) {
List<Film> films = filmService.allFilms(page);
int filmsCount = filmService.filmsCount();
int pagesCount = (filmsCount + 9)/10;
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("films");
modelAndView.addObject("page", page);
modelAndView.addObject("filmsList", films);
modelAndView.addObject("filmsCount", filmsCount);
modelAndView.addObject("pagesCount", pagesCount);
return modelAndView;
}
์ฌ๊ธฐ์ ์๋ก์ด ์ฃผ์์ด ๋ํ๋ฌ์ต๋๋ค @RequestParam
. ์ด๋ ์์ฒญ ๋งค๊ฐ๋ณ์์์ ์ด ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์์์ ๋ํ๋
๋๋ค. ์ด์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ฃผ์๋ก ์ด๋ํ๋ฉด(์ : http://localhost:8080/ ?page=4 ) ๊ทธ์ ๋ฐ๋ผ 4๋ฒ์งธ ํ์ด์ง๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋ http://localhost:8080/ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ฃผ์๋ก ์ด๋ํ๋ฉด ์ฒซ ๋ฒ์งธ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ธฐ๋ณธ๊ฐ์ " 1 "๋ก ์ค์ ํ์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๋ ์ฝ๋์ ์๋ฅผ ์ป์ ๋ค์ ์ด ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด์ง ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ ๊ฒ๋ค. ๋ ์ฝ๋๊ฐ 10๊ฐ๋ผ๋ฉด ์ด๋ 1ํ์ด์ง์ด๊ณ , 11๊ฐ๋ผ๋ฉด ์ด๋ฏธ 2๊ฐ์
๋๋ค. ์, ์ด ๋ชจ๋ ๊ฒ์ ๋ชจ๋ธ๋ก ์ ์กํฉ๋๋ค. ํ ์ฃผ๊ธฐ์ ๊ฑธ์ณ ๋ชจ๋ ๋งํฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ํ์ด์ง ์๋ฅผ ์์์ผ ํ๋ฉฐ, ์๋ฅผ ๋ค์ด ์ด ์ ๋ณด๋ฅผ ํ์ด์ง ์ด๋๊ฐ์ ํ์ํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ํ ์๋ฅผ ๊ฑฐ๊ธฐ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. ์ด์ ๋จ์ ๊ฒ์ film.jsp ๋ก ์ด๋ํ์ฌ ๋ค์ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ ํ์ด์ง์ ๋งํฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
<c:forEach begin="1" end="${pagesCount}" step="1" varStatus="i">
<c:url value="/" var="url">
<c:param name="page" value="${i.index}"/>
</c:url>
<a href="${url}">${i.index}</a>
</c:forEach>
์นด์ดํฐ 1, 2, 3, ...๋ณ๋ก ๋งํฌ๋ฅผ ์์ฑํ๊ณ ์ธ๋ฑ์ค ๊ฐ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํ์ด์ง ๋งค๊น๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ, ํํฐ๋ง, ๊ฒ์ ๋ฑ์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ DAO ๋ฉ์๋์ ์ ๋ฌํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์์์ ๋ฐ๋ผ ํ์ํ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ์ ํ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. |
FilmController
์ธ์คํด์ค ๋ณ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.int page
private int page;
๋ฉ์๋ ๋ด์์ allFilms
๋งค๊ฐ๋ณ์ ๊ฐ์ ์ด ๋ณ์์ ํ ๋นํฉ๋๋ค page
.
this.page = page;
์ ๊ฒ. ์ด ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ง๋ค(์ฆ, ํ์ด์ง๋ฅผ ํ์ํ ๋) ํ์ฌ ํ์ด์ง์ ๊ฐ์ด ๋ณ์์ ๊ธฐ๋ก๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฉ์๋์์ ์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ๋์ผํ ํ์ด์ง๋ก ๋ค์ ๋ฆฌ๋๋ ์
ํฉ๋๋ค.
modelAndView.setViewName("redirect:/?page=" + this.page);
๊ฒฐ๋ก
์๋ง ์ฌ๊ธฐ์ ๋๋ ๊ฒ ๊ฐ์์. ๊ทธ ๊ฒฐ๊ณผ ์์ ํ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ์ต๋๋ค. ํ์คํ ์ด์์ ์ธ ๊ฒ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ง๋ง(์์ฃผ ๋จผ) ์ต์ ํ ๋ฐ ๊ฐ์ ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ฒ๊ทธ๊ฐ ์์ ๋๊ณ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค. crud ์์ ์ ๋ด์ฅ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํํฐ๋ง, ๊ฒ์, ์ ๋ ฌ ์ถ๊ฐ; ๋ค๋ฅธ ๊ด๋ จ ํ ์ด๋ธ์ ์ถ๊ฐํฉ๋๋ค. ๊ถํ ๋ถ์ฌ ๋ฐ ์ธ์ฆ ๋ฑ์ ํตํด ๋ค์ํ ์ฌ์ฉ์์ ๋ํ ์ง์์ ๊ตฌํํฉ๋๋ค. ๋ฑ๋ฑ. ์์์ ๋ฒ์๋ ๋ฌดํํ๋ ๋ง์๊ป ๋ฐ์ด๋ณด์ธ์. ์ด ํ๋ก์ ํธ์ github์ ๋งํฌํ์ธ์ . ๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. PS ์ด๋ฒ์ด ๋ด ์ธ์์์ ์ฒ์์ผ๋ก ๊ธฐ์ฌ๋ฅผ ์ฐ๋ ค๋ ์๋์ด๋ฏ๋ก ์๊ฒฉํ๊ฒ ํ๋จํ์ง ๋ง์ญ์์ค :). ์ ์ฉํ ๋ฆฌ์์ค์ ๋ํ ๋ค๋ฅธ ๋งํฌ๋ฅผ ์ถ๊ฐํ์ง ์์ ์ ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ถํํ๋ ์ ๋ณด๋ฅผ ์ป๋ ์์ค์ ๋ํ ๋งํฌ๋ฅผ ์ ์ฅํ๋ ์ต๊ด์ ์์ง ๊ธฐ๋ฅผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ๋ง์ ํธ์ง์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๊ฐ๊ฒฐํจ์ ์ ์ฌ๋ฅ์ด ์๋๋ฏ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ฒ๋ฆฌํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ชจ๋ ๋ถ๋ถ์ ๋ํ ๋งํฌ- Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์๊ฐ(1๋ถ)
- Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์๊ฐ(2๋ถ)
- Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์๊ฐ(3๋ถ)
- Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒ์งธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์๊ฐ(4๋ถ)
GO TO FULL VERSION