JavaRush /Java Blog /Random-KO /Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒˆ์งธ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ๊ฐœ(4๋ถ€)...
ะœะฐะบั
๋ ˆ๋ฒจ 41

Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒˆ์งธ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ๊ฐœ(4๋ถ€)

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์ข‹์€ ์˜คํ›„์—์š”. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๊ฐ„๋‹จํ•œ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ Maven, Spring, Hibernate, MySQL ๋ฐ Tomcat๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ฒ˜์Œ ์ ‘ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๋Š” ์ฃผ๋กœ ์—ฌ๊ธฐ์—์„œ 30~40๊ฐœ์˜ ๋ ˆ๋ฒจ์„ ์™„๋ฃŒํ–ˆ์ง€๋งŒ ์ˆœ์ˆ˜ Java๋ฅผ ๋„˜์–ด์„œ๋Š” ๋ชจํ—˜์„ ์•„์ง ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ์ˆ , ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๊ธฐํƒ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜คํ”ˆ ์›”๋“œ์— ์ง„์ž…ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ(๋˜๋Š” ๊ณง ์‹œ์ž‘ํ•˜๋ ค๋Š”) ์‚ฌ๋žŒ๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์–ด. ์ด๊ฒƒ์€ "Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒˆ์งธ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ๊ฐœ" ๊ธฐ์‚ฌ์˜ ๋งˆ์ง€๋ง‰ ๋„ค ๋ฒˆ์งธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋ถ€๋ถ„์€ ๋‹ค์Œ ๋งํฌ๋ฅผ ํ†ตํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ :

๋””์ž์ธ ๋ฐ ์›น ๋ฆฌ์†Œ์Šค

์šฐ๋ฆฌ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ˆˆ๋ฌผ, ์ง€๋ฃจํ•œ ๋น„๋ฌธ, ๋ณด๊ธฐ ํ‰ํ•œ ๋งํฌ, ๋นˆ ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ ์—†์ด๋Š” ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค๋ฅธ ์•„๋ฆ„๋‹ค์›€์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์šฐ์„ , HTML ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๋ฉด์„œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ํ•˜์ง€๋งŒ HTML๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ๊ฒฝ, ์ƒ‰์ƒ, ํฌ๊ธฐ, ์š”์†Œ ๋ฐฐ์—ด ๋“ฑ์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋“ฑ๋“ฑ. ๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ตญ ๋‚˜์ค‘์— ์•„๋ฌด๊ฒƒ๋„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ํŽ˜์ด์ง€๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ HTML์˜ ๋””์ž์ธ ์˜ต์…˜์€ ๋งค์šฐ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” CSS (Cascading Style Sheets)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋””์ž์ธ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๊ณณ์— ๋ชจ์•„ ํŽ˜์ด์ง€์˜ ์›ํ•˜๋Š” ์š”์†Œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CSS ์ฝ”๋“œ๋Š” JSP ํŽ˜์ด์ง€์˜ ํŠน์ˆ˜ ํƒœ๊ทธ ์— ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ณ„๋„์˜ ํŒŒ์ผ์— ๋„ฃ์–ด์„œ ํ•„์š”ํ•œ ํŽ˜์ด์ง€์— ๊ฐ„๋‹จํžˆ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ๋ฐ ๊ธฐํƒ€ ์ •์  ์›น ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด webapp ๋‚ด์— ๋ณ„๋„์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค . ์›น ๋ฆฌ์†Œ์Šค๋ฅผ ์ผ๋ฐ˜ ๋ฆฌ์†Œ์Šค( db.properties๊ฐ€ ์žˆ๋Š” ๊ณณ)์™€ ํ˜ผ๋™ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ res๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๋ชจ๋“  CSS ํŒŒ์ผ, ์ด๋ฏธ์ง€ ๋“ฑ์„ ์—ฌ๊ธฐ์— ๋ฐฐ์น˜ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค .
Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒˆ์งธ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ๊ฐœ(4๋ถ€) - 1
์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์—์„œ ํ•ด๋‹น ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ˆ˜์—…์— ๊ฐ€์ž 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;
}
๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ํ…Œ์ด๋ธ”์„ ์™„์ „ํžˆ ๋ฐ”๊ฟ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ฌผ๋ก  ์–ด๋ฆฌ์„์–ด ๋ณด์ด์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ ‡์Šต๋‹ˆ๋‹ค). Maven, Spring, MySQL, Hibernate ๋ฐ ์ฒซ ๋ฒˆ์งธ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ๊ฐœ(4๋ถ€) - 2CSS์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋งํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—์„œ๋Š” ํ…Œ์ด๋ธ”๊ณผ ์–‘์‹์„ ๋””์ž์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์„ฑ ์˜ต์…˜์„ ๋งŽ์ด ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌผ๋ก  ์ง์ ‘ ๋””์ž์ธํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ๋””์ž์ด๋„ˆ๊ฐ€ ๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ด๊ฒƒ์€ ์ผ์ข…์˜ ๋ณต์žกํ•œ ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋งŒ๋‚œ ์ง€ ๋ช‡ ์‹œ๊ฐ„๋งŒ ์ง€๋‚˜๋ฉด ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ ํŽ˜์ด์ง€์— ์ƒ๋‹นํžˆ ์•„๋ฆ„๋‹ต๊ณ  ๊น”๋”ํ•œ ๋””์ž์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ธํ„ฐ๋„ท์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐ•์˜์™€ ์˜ˆ์ œ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์œผ๋ฉฐ, ํ•œ ํ™”๋ฉด์—์„œ HTML, CSS๋ฅผ ๋™์‹œ์— ํŽธ์ง‘ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ์—ฐ์Šต์„ ํ†ตํ•ด ์‹ค์ œ ์˜ˆ์ˆ  ์ž‘ํ’ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์—ฌ๊ธฐ์„œ๋„ ๋„ˆ๋ฌด ํฅ๋ถ„ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก  ๋””์ž์ด๋„ˆ๊ฐ€ ๋  ๊ณ„ํš์ด ์—†๋‹ค๋ฉด). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋””์ž์ธ์ด ๊ทธ๋Ÿฐ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์•„์ฃผ ์˜ค๋žซ๋™์•ˆ ๊ฐ‡ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ CSS๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ, ๋ชจ๋“  ์†์„ฑ์„ ์‹œํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๊ณ , ๋ญ”๊ฐ€๋ฅผ ๋น„ํ‹€๊ณ , ์†๋ณด๊ณ , ์‹คํ—˜ํ•˜๊ณ , ์ผ๋ถ€ ์‚ฌ์ดํŠธ์˜ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์™€ ์•Œ์•„๋ณผ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ์ด ์žฅ๋‚œ๊ฐ์ด ๋†“์•„์งˆ ๋•Œ๊นŒ์ง€ ์ผ์ฃผ์ผ ๋™์•ˆ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ๋†€์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :) ๊ธ€์Ž„์š”, ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณผ์šฉํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ๋‹ค์ฑ„๋กœ์šด ๊ธฐ์ ์„ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์„ธ๋ จ๋˜๊ฒŒ. ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CSS๋Š” ๋””์ž์ธ์— ๋Œ€ํ•œ ์„ค๋ช… ์ด๊ณ  HTML์€ ๋งˆํฌ์—…์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . CSS๋ฅผ ํ†ตํ•ด ์ ˆ๋Œ€์ ์œผ๋กœ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ธก๋ฉด์€ ์ˆ˜ํ–‰ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ์ผ๋ถ€๋Š” ๋‹จ์ˆœํžˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. HTML์—์„œ๋Š” ๋ช‡ ์ค„์˜ ์ถ”๊ฐ€ ๋ผ์ธ ๋˜๋Š” ํƒœ๊ทธ์— ๋‹จ ํ•˜๋‚˜์˜ ์†์„ฑ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฒฐํ•ฉํ•˜๊ณ  CSS๋กœ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ƒ‰์ƒ, ๋ฐฐ๊ฒฝ, ๊ธ€๊ผด์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‘ ๊ฐœ์˜ ํ‘œ ์…€์„ ๊ฒฐํ•ฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ HTML ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, CSS์™€ HTML์„ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆฌ๋ฉฐ ๋ช‡ ์‹œ๊ฐ„ ๋งŒ์— ํŽ˜์ด์ง€์—์„œ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ๋งŒ๋“  ํ˜ผ๋ž€์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ GitHub ๋งํฌ): ะ—ะฝะฐะบะพะผัั‚ะฒะพ ั Maven, Spring, MySQL, Hibernate ะธ ะฟะตั€ะฒะพะต CRUD ะฟั€ะธะปะพะถะตะฝะธะต (ั‡ะฐัั‚ัŒ 4) - 3๋ฌผ๋ก  ์ œ๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋ชจ๋“  ์ผ์„ ์–ผ๋งˆ๋‚˜ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์ผ์ฃผ์ผ ์ „์— 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&ltFilm> 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 ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ž‘์€ ํ„ฐ์น˜๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ถ”๊ฐ€, ํŽธ์ง‘ ๋ฐ ์‚ญ์ œ ๋ฉ”์†Œ๋“œ์—์„œ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ๊ธฐ๋ณธ ํŽ˜์ด์ง€ "redirect:/" ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค . ์ €๊ฒƒ. 50๋ฒˆ์งธ ํŽ˜์ด์ง€ ์–ด๋”˜๊ฐ€์— ์žˆ๊ณ  ํ•ญ๋ชฉ ํŽธ์ง‘์„ ํด๋ฆญํ•˜๋ฉด ์‹คํ–‰ ํ›„ " / " ์ฃผ์†Œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. 1ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์™”๋˜ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ด๋ณด์ž. ํด๋ž˜์Šค์— FilmController์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.int page
private int page;
๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ allFilms๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์ด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค page.
this.page = page;
์ €๊ฒƒ. ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค(์ฆ‰, ํŽ˜์ด์ง€๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ) ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๊ฐ’์ด ๋ณ€์ˆ˜์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ์—์„œ ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ํŽ˜์ด์ง€๋กœ ๋‹ค์‹œ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.
modelAndView.setViewName("redirect:/?page=" + this.page);

๊ฒฐ๋ก 

์•„๋งˆ ์—ฌ๊ธฐ์„œ ๋๋‚  ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ ๊ฒฐ๊ณผ ์™„์ „ํ•œ CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์ด์ƒ์ ์ธ ๊ฒƒ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์ง€๋งŒ(์•„์ฃผ ๋จผ) ์ตœ์ ํ™” ๋ฐ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜๊ณ  ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. crud ์ž‘์—…์— ๋‚ด์žฅ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง, ๊ฒ€์ƒ‰, ์ •๋ ฌ ์ถ”๊ฐ€; ๋‹ค๋ฅธ ๊ด€๋ จ ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์ธ์ฆ ๋“ฑ์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋“ฑ. ์ƒ์ƒ์˜ ๋ฒ”์œ„๋Š” ๋ฌดํ•œํ•˜๋‹ˆ ๋งˆ์Œ๊ป ๋›ฐ์–ด๋ณด์„ธ์š”. ์ด ํ”„๋กœ์ ํŠธ์˜ github์— ๋งํฌํ•˜์„ธ์š” . ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. PS ์ด๋ฒˆ์ด ๋‚ด ์ธ์ƒ์—์„œ ์ฒ˜์Œ์œผ๋กœ ๊ธฐ์‚ฌ๋ฅผ ์“ฐ๋ ค๋Š” ์‹œ๋„์ด๋ฏ€๋กœ ์—„๊ฒฉํ•˜๊ฒŒ ํŒ๋‹จํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค :). ์œ ์šฉํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ ์ ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ •๋ณด๋ฅผ ์–ป๋Š” ์†Œ์Šค์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ €์žฅํ•˜๋Š” ์Šต๊ด€์€ ์•„์ง ๊ธฐ๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๋งŽ์€ ํŽธ์ง€์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ„๊ฒฐํ•จ์€ ์ œ ์žฌ๋Šฅ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋งํฌ
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION