์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array ๊ฐ์ฒด
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey๐ณ๐
[61] 230327 Spring: ์ดํด๋ฆฝ์ค์ ์คํ๋ง ์ค์นํ๊ณ ์คํํ๊ธฐ [K-๋์งํธ ํธ๋ ์ด๋ 61์ผ] ๋ณธ๋ฌธ
[61] 230327 Spring: ์ดํด๋ฆฝ์ค์ ์คํ๋ง ์ค์นํ๊ณ ์คํํ๊ธฐ [K-๋์งํธ ํธ๋ ์ด๋ 61์ผ]
yjyuwisely 2023. 3. 27. 14:09230327 Mon 61st class
Ch. 18 MVC ํจํด ๊ตฌํ
์ง๋: Ch. 18 MVC ํจํด ๊ตฌํ์ ๊ธฐ๋ฐํ ์์ฒด ์์
(๊ต์ฌ: ์ต๋ฒ๊ท ์ JSP 2.3 ์น ํ๋ก๊ทธ๋๋ฐ: ๊ธฐ์ด๋ถํฐ ์ค๊ธ๊น์ง, ์ ์: ์ต๋ฒ๊ท )
์ฑ
์์ ์ฝ๋: https://github.com/madvirus/jsp23
์ ์ ๋ธ๋ก๊ทธ: https://javacan.tistory.com/
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
์๋ฐ์์๋ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ํ์ค์ด๋ค.
์คํ๋ง ์ค์นํ๊ณ ์คํํ๊ธฐ
์ฐ์ , ์๋ฐ๊ฐ ์ค์น๋์ด ์์ด์ผ ํ๋ค.
- ์ดํด๋ฆฝ์ค: STS ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ ์ค์น ํ ์ฌ์ฉ
- STS์ ๊ฒฝ์ฐ: ๋ณ๋๋ก ๋ค์ด๋ก๋ ๋ฐ ์์ถ ํด์
์ฐธ๊ณ : https://curiousing.tistory.com/17
Help - Install New Software์ ๋๋ฅธ๋ค.
http://download.springsource.com/release/TOOLS/update/e4.8
์ดํด๋ฆฝ์ค์ ์คํ๋ง ์ค์น๊ฐ ์๋ฃ๋๋ค.
SpringEx๋ฅผ Workspace์ ์ฎ๊ธด๋ค.
File - Import Projects from File System or Archive๋ฅผ ๋๋ฅธ๋ค.
src - test: ๋ง ๊ทธ๋๋ก ํ
์คํธํ๋ ๊ณณ
src - main: ๊ตฌํํ๋ ๊ณณ
src - main- webapp - WEB-INF - views์ jsp ํ์ผ์ ๋ง๋ ๋ค.
src - main - webapp - resources์ css, js ํ์ผ์ ๋ฃ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฐ๊ฒฐ ๊ฒฝ๋ก๋ฅผ ์ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊น์ง๊ฐ MVC ์ค V์ด๋ค.
์ปจํธ๋กค๋ฌ๋ ์ฌ์ฉ์ ํ๋ฉด๊ณผ ์๋ฒ๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ค.
๋ชจ๋ธ 2์ M, C๊ฐ Java Resources์ ์๋ค.
MVC ์ค C(์ปจํธ๋กค๋ฌ: ์ฌ์ฉ์ ํ๋ฉด๊ณผ ์๋ฒ๋ฅผ ์ฐ๊ฒฐ)์ด๋ค.
์ปจํธ๋กค๋ฌ๋ ์ฌ์ฉ์๊ฐ ๋ด๋ฆฐ ๋ช
๋ น์ ์ ์ผ ์ฒ์ ์ง์
ํ๋ฏ๋ก ์ง์
์ ์ด๋ผ๊ณ ๋ ํ๋ค.
MVC ์ค M(๋ชจ๋ธ)์ด๋ค.
ํ๋ก์ ํธ๋ฅผ ํ ๋ ๋๊ฐ์ ํ๋ก์ ํธ ์ด๋ฆ์ผ๋ก ๋ง๋ ๋ค. (์ด๋ฆ ๋ค๋ฅด๋ฉด ํฉ์น ๋ ์ด๊ธ๋๋ค.)
ํ๋ก์ ํธ ์ด๋ฆ์ ๋ง๋ค๋ฉด org.hj.controller๊ฐ ๋๋ค.
HomeController.java๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ธ์๋ ๊ฑฐ๊ณ (MVC์ C), ๋๋จธ์ง๋ ํ์์ ์ํด์ ๋ง๋ ๊ฒ์ด๋ค.
JSP์ ๋ค๋ฅด๊ฒ, Spring์ ํ๋ก์ ํธ๋ฅผ ์ ํํด์ Run As - Run on Server๋ฅผ ๋๋ฅธ๋ค.
์ปจํธ๋กค๋ฌ๊ฐ JSP๋ฅผ ์คํ์ํค๋ ๊ฒ์ด๋ค. (๋ฌด์กฐ๊ฑด ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฑฐ์ณ์ ๊ฐ๋ ๊ฒ์ด๋ค.)
์๋ ์ฐฝ์ด ๋์จ๋ค.
์ฝ์๋ง ์ ๋ด๋ ๋ฌธ์ ํด๊ฒฐ์ด ๋๋ค.
root-context.xml: example์ sample๋ก ๋ฐ๊พผ๋ค.
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sample?serverTimezone=Asia/Seoul"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
๋นจ๊ฐ ๋๋ํ ๋ด์ ๋ Maven - Update Project ๋๋ฅธ๋ค.
GR์ ๊ทธ๋ฅ ์ปดํจํฐ ์ด๋ฆ์ด๊ณ .m2 - repository๊ฐ ์๋์ ์ผ๋ก ์์ฑ๋๋ค.
๊ฒฐ๊ณผ: ์๋ฒ์ ์ฐ๊ฒฐ๋ผ์ ํ์ด์ง๊ฐ ๋ด๋ค.
์ด ์ฅ์ ์ปจํธ๋กค๋ฌ์ ๋ํ ์ค๋ช
์ด๋ค.
www.naver.com -> ๋๋ฉ์ธ ๋ค์
๋ก์ปฌ ํธ์คํธ -> ์ ์ฉ ๋ฒํธ
๋๋ฉ์ธ ๋ค์์ด ์์ผ๋ฏ๋ก ํฐ์บฃ์์ ์ธํ
ํ ๊ฒ ๋ก์ปฌํธ์คํธ (localhost:8080/)์ด๋ค.
http://localhost:8081/controller/
์๋ฒ์ด๋ฆ(๋๋ฉ์ธ)/contextpath
contextpath๋ ํฐ์บฃ์์ ํ์ธํ๋ค.
์ดํด๋ฆฝ์ค์ Servers๋ฅผ ๋๋ธ ํด๋ฆญํด์ ์๋ Modules ๋๋ฅด๋ฉด ์๋ ์ ๋ณด๊ฐ ๋์จ๋ค.
URL์ฃผ์์ /controller๊ฐ ๋์ค๋ ์ด์ ๊ฐ ์๋์ ๊ฐ๋ค.
Edit๋ฅผ ๋๋ฌ์ ์ด๋ฆ์ ๋ฐ๊ฟ ์๋ ์๋ค. ์๋ฒ ์ฃฝ์ด๊ณ ๋ค์ ์คํํ๋ฉด URL ์ฃผ์๊ฐ ๋ฐ๋๋ค. (์๊ฐ์ ๊ฑธ๋ฆฐ๋ค.)
๊ฒฐ๊ณผ) URL ์ฃผ์๊ฐ ๋ฐ๋์๋ค. (localhost:8081/controller/ -> localhost:8081)
์ ๊ฒฐ๊ณผ๋ home.jsp์์ ๋์จ ๊ฒ์ด๊ณ ,
ํ ์ปจํธ๋กค๋ฌ์ ์๋ ๊ฒฝ๋ก๋ก ์คํ์์ผ์ ๋์จ ๊ฒฐ๊ณผ์ด๋ค.
(๊ฒฝ๋ก: src - main- webapp - WEB-INF - views)
์ฝ๋) home.jsp
package org.hj.controller;
import java.util.Locale;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
// ์ ๊ทผ์ ์ด์ ๋ฐํํ์
๋ฉ์๋๋ช
(๋งค๊ฐ๋ณ์, ๋งค๊ฐ๋ณ์)
//public ์ ๊ทผ ์ ํ์, String ๋ฆฌํด ํ์
, home ๋ฉ์๋, (๋งค๊ฐ๋ณ์ํ์
,๋งค๊ฐ๋ณ์๋ช
)
public String home(Locale locale, Model model) { //์ง๊ธ์ ์ฐ์์ด ์๋ค. (๊ทธ๋ฅ ์๋ ๊ฒ.)
return "home"; //home์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์คํํ๋ค. //๋ฉ๋ชจ์ฅ์ URL์ฃผ์๊ฐ ํธ์ถํ ๊ฒ์ด๋ค.
// /WEB-INF/views/home.jsp
}
@RequestMapping(value = "/drop", method = RequestMethod.GET)
// ์ ๊ทผ์ ์ด์ ๋ฐํํ์
๋ฉ์๋๋ช
(๋งค๊ฐ๋ณ์, ๋งค๊ฐ๋ณ์)
public String drop() {
return "drop";
}
}
์๋๋ ์๋ฒ ์ญํ ์ ํ๋ ํ์ผ์ด๋ค. servlet-context.xml
(๊ฒฝ๋ก: SpringEx - src - main - webapp - WEB-INF - spring - appServlet)
์ฝ๋) servlet-context.xml
์์ home.jsp์ ๊ฒฝ๋ก
/WEB-INF/views/home.jsp
๋ฅผ ์๋ ค์ค๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="org.hj.controller" />
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</beans:bean>
</beans:beans>
http://localhost:8080/์ ๊ณ ์ ์ด๋ค.
์คํ๋งํํ
๋ช
๋ น์ ์ฃผ๋ฉด ์คํ๋ง์ ์ ๋ ๊ฒ ์คํํ๋ค๋ ๊ฒ์ด๋ค.
URL ์ฃผ์๋ฅผ ์์ฑํ๋ฉด return์ด ์์ด๋ ๋๋ค.
URL ์ฃผ์์ ์คํํ๋ ๊ฒ์ด ๋ค๋ฅด๋ฉด return์ ์ค๋ค.
1๋ฒ ์ฝ๋) http://localhost:8080/sample/aaa
=> value="sample", value="aaa"
views - sample - aaa.jsp๋ฅผ ์คํํ๊ฒ ๋๋ค.
(return "sample/aaa"์ ๊ฐ๋ค.)
2๋ฒ ์ฝ๋) bbb.jsp๋ฅผ ์คํํด์ผํ๋ฏ๋ก return "bbb";๋ฅผ ์ด๋ค.
3๋ฒ ์ฝ๋) ccc.jsp๋ฅผ ์คํํด์ผํ๋ฏ๋ก return "sample/ccc";๋ฅผ ์ด๋ค.
=> C: ์ด ์ญํ ์ ์ปจํธ๋กค๋ฌ๊ฐ ํ๋ค.
V: views ํด๋ ์์ ์๋ ๊ฒ
M: ๋ชจ๋ธ ํจํค์ง ์์ ์๋ ๊ฒ
http://localhost:8080/sample/aaa?id=aaa
id=aaa๋ฅผ ๋ณด๋ธ๋ค.
๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๊ฐ์ ๋ฐ๋๋ค.
1)๋ฒ ์ฝ๋์ ๋งค๊ฐ๋ณ์๋ฅผ String id๋ก ์ค์ ํ๋ค.
public void basic(String id){
Logger.info("sample/aaa");
}
}
mysql ์ดํ ๋ถ๋ถ์ ์์ ํ๋ฉด jar ํ์ผ์ ์ง์ ๋ฃ๋ ๋์ ์์์ ์์ ํด์ค๋ค๊ณ ํ๋ค.
์ฝ๋) pom.xml
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
https://mvnrepository.com/artifact/mysql/mysql-connector-java
์ ์ฝ๋๋ฅผ pom.xml์ ๋ถ์ฌ๋ฃ์ผ๋ฉด jar ํ์ผ์ ๋ค์ด ๋ฐ๊ฒ ํ๋ค.
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
https://mvnrepository.com/artifact/com.zaxxer/HikariCP
์ฝ๋) pom.xml์์ ํด๋นํ๋ ๊ฒ
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.4</version>
</dependency>
์ฝ๋) root-context.xml์์ ํด๋นํ๋ ๊ฒ
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- DBCP(DB Connection Pool) -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sample?serverTimezone=Asia/Seoul"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
์ฐธ๊ณ : https://oingdaddy.tistory.com/13
์ฐธ๊ณ (Mybatis์ ์คํ๋ง ์ฐ๋ํ๊ธฐ): https://lifere.tistory.com/117