Skip to content

Commit d5bc4c2

Browse files
authored
[boostCourse] spring mvc practice
1 parent fe38cf8 commit d5bc4c2

35 files changed

+868
-0
lines changed

guestbook/pom.xml

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>kr.or.connect</groupId>
5+
<artifactId>guestbook</artifactId>
6+
<packaging>war</packaging>
7+
<version>0.0.1-SNAPSHOT</version>
8+
<name>guestbook Maven Webapp</name>
9+
<url>http://maven.apache.org</url>
10+
<properties>
11+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
12+
<spring.version>4.3.5.RELEASE</spring.version>
13+
<jackson2.version>2.8.6</jackson2.version>
14+
</properties>
15+
16+
<dependencies>
17+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
18+
<dependency>
19+
<groupId>org.springframework</groupId>
20+
<artifactId>spring-context</artifactId>
21+
<version>${spring.version}</version>
22+
</dependency>
23+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
24+
<dependency>
25+
<groupId>org.springframework</groupId>
26+
<artifactId>spring-webmvc</artifactId>
27+
<version>${spring.version}</version>
28+
</dependency>
29+
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
30+
<dependency>
31+
<groupId>javax.servlet</groupId>
32+
<artifactId>javax.servlet-api</artifactId>
33+
<version>3.1.0</version>
34+
<scope>provided</scope>
35+
</dependency>
36+
<!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
37+
<dependency>
38+
<groupId>javax.servlet.jsp</groupId>
39+
<artifactId>javax.servlet.jsp-api</artifactId>
40+
<version>2.3.1</version>
41+
<scope>provided</scope>
42+
</dependency>
43+
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
44+
<dependency>
45+
<groupId>javax.servlet</groupId>
46+
<artifactId>jstl</artifactId>
47+
<version>1.2</version>
48+
</dependency>
49+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
50+
<dependency>
51+
<groupId>org.springframework</groupId>
52+
<artifactId>spring-jdbc</artifactId>
53+
<version>${spring.version}</version>
54+
</dependency>
55+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
56+
<dependency>
57+
<groupId>org.springframework</groupId>
58+
<artifactId>spring-tx</artifactId>
59+
<version>${spring.version}</version>
60+
</dependency>
61+
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
62+
<dependency>
63+
<groupId>mysql</groupId>
64+
<artifactId>mysql-connector-java</artifactId>
65+
<version>8.0.18</version>
66+
</dependency>
67+
68+
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
69+
<dependency>
70+
<groupId>org.apache.commons</groupId>
71+
<artifactId>commons-dbcp2</artifactId>
72+
<version>2.1.1</version>
73+
</dependency>
74+
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
75+
<dependency>
76+
<groupId>com.fasterxml.jackson.core</groupId>
77+
<artifactId>jackson-databind</artifactId>
78+
<version>${jackson2.version}</version>
79+
</dependency>
80+
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jdk8 -->
81+
<dependency>
82+
<groupId>com.fasterxml.jackson.datatype</groupId>
83+
<artifactId>jackson-datatype-jdk8</artifactId>
84+
<version>${jackson2.version}</version>
85+
</dependency>
86+
<!-- junit -->
87+
<dependency>
88+
<groupId>junit</groupId>
89+
<artifactId>junit</artifactId>
90+
<version>3.8.1</version>
91+
<scope>test</scope>
92+
</dependency>
93+
</dependencies>
94+
<build>
95+
<finalName>guestbook</finalName>
96+
97+
<plugins>
98+
<plugin>
99+
<groupId>org.apache.maven.plugins</groupId>
100+
<artifactId>maven-compiler-plugin</artifactId>
101+
<version>3.6.1</version>
102+
<configuration>
103+
<source>1.8</source>
104+
<target>1.8</target>
105+
</configuration>
106+
</plugin>
107+
</plugins>
108+
</build>
109+
</project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package kr.or.connect.guestbook.config;
2+
3+
import org.springframework.context.annotation.ComponentScan;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.context.annotation.Import;
6+
7+
@Configuration
8+
@ComponentScan(basePackages = { "kr.or.connect.guestbook.dao", "kr.or.connect.guestbook.service"})
9+
@Import({ DBConfig.class })
10+
public class ApplicationConfig {
11+
12+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package kr.or.connect.guestbook.config;
2+
3+
4+
import javax.sql.DataSource;
5+
6+
import org.apache.commons.dbcp2.BasicDataSource;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
10+
import org.springframework.transaction.PlatformTransactionManager;
11+
import org.springframework.transaction.annotation.EnableTransactionManagement;
12+
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
13+
14+
@Configuration
15+
@EnableTransactionManagement
16+
public class DBConfig implements TransactionManagementConfigurer {
17+
private String driverClassName = "com.mysql.jdbc.Driver";
18+
19+
private String url = "jdbc:mysql://localhost:3306/connectdb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul";
20+
21+
private String username = "root";
22+
23+
private String password = "dlehdwns";
24+
25+
@Bean
26+
public DataSource dataSource() {
27+
BasicDataSource dataSource = new BasicDataSource();
28+
dataSource.setDriverClassName(driverClassName);
29+
dataSource.setUrl(url);
30+
dataSource.setUsername(username);
31+
dataSource.setPassword(password);
32+
return dataSource;
33+
}
34+
35+
@Override
36+
public PlatformTransactionManager annotationDrivenTransactionManager() {
37+
return transactionManger();
38+
}
39+
40+
@Bean
41+
public PlatformTransactionManager transactionManger() {
42+
return new DataSourceTransactionManager(dataSource());
43+
}
44+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package kr.or.connect.guestbook.config;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.ComponentScan;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
7+
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
8+
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
9+
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
10+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
11+
import org.springframework.web.servlet.view.InternalResourceViewResolver;
12+
13+
@Configuration
14+
@EnableWebMvc
15+
@ComponentScan(basePackages = { "kr.or.connect.guestbook.controller" })
16+
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter{
17+
18+
@Override
19+
public void addResourceHandlers(ResourceHandlerRegistry registry) {
20+
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
21+
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
22+
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
23+
}
24+
25+
// default servlet handler를 사용하게 합니다.
26+
@Override
27+
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
28+
configurer.enable();
29+
}
30+
31+
@Override
32+
public void addViewControllers(final ViewControllerRegistry registry) {
33+
System.out.println("addViewControllers가 호출됩니다. ");
34+
registry.addViewController("/").setViewName("index");
35+
}
36+
37+
@Bean
38+
public InternalResourceViewResolver getInternalResourceViewResolver() {
39+
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
40+
resolver.setPrefix("/WEB-INF/views/");
41+
resolver.setSuffix(".jsp");
42+
return resolver;
43+
}
44+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package kr.or.connect.guestbook.controller;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import javax.servlet.http.HttpServletRequest;
10+
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.web.bind.annotation.DeleteMapping;
13+
import org.springframework.web.bind.annotation.GetMapping;
14+
import org.springframework.web.bind.annotation.PathVariable;
15+
import org.springframework.web.bind.annotation.PostMapping;
16+
import org.springframework.web.bind.annotation.RequestBody;
17+
import org.springframework.web.bind.annotation.RequestMapping;
18+
import org.springframework.web.bind.annotation.RequestParam;
19+
import org.springframework.web.bind.annotation.RestController;
20+
21+
import kr.or.connect.guestbook.dto.Guestbook;
22+
import kr.or.connect.guestbook.service.GuestbookService;
23+
24+
@RestController
25+
@RequestMapping(path="/guestbooks")
26+
public class GuestbookApiController {
27+
@Autowired
28+
GuestbookService guestbookService;
29+
30+
@GetMapping
31+
public Map<String, Object> list(@RequestParam(name="start", required=false, defaultValue="0") int start) {
32+
33+
List<Guestbook> list = guestbookService.getGuestbooks(start);
34+
35+
int count = guestbookService.getCount();
36+
int pageCount = count / GuestbookService.LIMIT;
37+
if(count % GuestbookService.LIMIT > 0)
38+
pageCount++;
39+
40+
List<Integer> pageStartList = new ArrayList<>();
41+
for(int i = 0; i < pageCount; i++) {
42+
pageStartList.add(i * GuestbookService.LIMIT);
43+
}
44+
45+
Map<String, Object> map = new HashMap<>();
46+
map.put("list", list);
47+
map.put("count", count);
48+
map.put("pageStartList", pageStartList);
49+
50+
return map;
51+
}
52+
53+
@PostMapping
54+
public Guestbook write(@RequestBody Guestbook guestbook,
55+
HttpServletRequest request) {
56+
String clientIp = request.getRemoteAddr();
57+
// id가 입력된 guestbook이 반환된다.
58+
Guestbook resultGuestbook = guestbookService.addGuestbook(guestbook, clientIp);
59+
return resultGuestbook;
60+
}
61+
62+
@DeleteMapping("/{id}")
63+
public Map<String, String> delete(@PathVariable(name="id") Long id,
64+
HttpServletRequest request) {
65+
String clientIp = request.getRemoteAddr();
66+
67+
int deleteCount = guestbookService.deleteGuestbook(id, clientIp);
68+
return Collections.singletonMap("success", deleteCount > 0 ? "true" : "false");
69+
}
70+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package kr.or.connect.guestbook.controller;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import javax.servlet.http.HttpServletRequest;
7+
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.stereotype.Controller;
10+
import org.springframework.ui.ModelMap;
11+
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.ModelAttribute;
13+
import org.springframework.web.bind.annotation.PostMapping;
14+
import org.springframework.web.bind.annotation.RequestParam;
15+
16+
import kr.or.connect.guestbook.dto.Guestbook;
17+
import kr.or.connect.guestbook.service.GuestbookService;
18+
19+
@Controller
20+
public class GuestbookController {
21+
@Autowired
22+
GuestbookService guestbookService;
23+
24+
@GetMapping(path="/list")
25+
public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
26+
ModelMap model) {
27+
28+
// start로 시작하는 방명록 목록 구하기
29+
List<Guestbook> list = guestbookService.getGuestbooks(start);
30+
31+
// 전체 페이지수 구하기
32+
int count = guestbookService.getCount();
33+
int pageCount = count / GuestbookService.LIMIT;
34+
if(count % GuestbookService.LIMIT > 0)
35+
pageCount++;
36+
37+
// 페이지 수만큼 start의 값을 리스트로 저장
38+
// 예를 들면 페이지수가 3이면
39+
// 0, 5, 10 이렇게 저장된다.
40+
// list?start=0 , list?start=5, list?start=10 으로 링크가 걸린다.
41+
List<Integer> pageStartList = new ArrayList<>();
42+
for(int i = 0; i < pageCount; i++) {
43+
pageStartList.add(i * GuestbookService.LIMIT);
44+
}
45+
46+
model.addAttribute("list", list);
47+
model.addAttribute("count", count);
48+
model.addAttribute("pageStartList", pageStartList);
49+
50+
return "list";
51+
}
52+
53+
@PostMapping(path="/write")
54+
public String write(@ModelAttribute Guestbook guestbook,
55+
HttpServletRequest request) {
56+
String clientIp = request.getRemoteAddr();
57+
System.out.println("clientIp : " + clientIp);
58+
guestbookService.addGuestbook(guestbook, clientIp);
59+
return "redirect:list";
60+
}
61+
}

0 commit comments

Comments
 (0)