=> maven project : eclipse
xml
=> gradle project : intellij(android)
json
spring di(loC)
spring aop
=> spring mvc 만들기 위함
xml(bean configyration file)
annotation
+ jdbc / mybatis / lombok
=> spring boot : 라이브러리 설정을 편리하게 설정하려고 나옴
환경 설정 툴 필요(pom.xml에 적는 것이 아닌 설정해주는 것)
* 설정을 하기위해 사용하는 것
Spring initializr(https://start.spring.io/ : spring boot에 대한 환경설정)
프로젝트 구성을 다운로드 받아서 사용
=> visual studio code
=> intellij
Spring Tool
eclipse + Spring Tool 4
eclipse + sts(plug - in)
전자정부프레임워크
eclipse + Spring Tool 4 + 전자정부프레임워크 ...
Spring Boot
Window Application(CUI, GUI) 제작 가능
Web Application 제작 가능
jdk 11 - spring2.x.x (jdk11버전은 spring2점대 버전과 호환)
jdk 17 - spring3.x.x (jdk17버전은 spring3점대 버전과 호환)
spring 언어
java <- jsp는
kotlin <- android(kotlin)
groovy
이클립스 실행 은
C:\java\boot-workspace 로 이클립스 실행 -> Help -> Eclipse Marketplace -> sts 검색 -> 아래 사진 다운 -> 다운 다 되면 Restartnow 해주면 된다.
그럼 위에 Boot Dashboard 아이콘이 생김
new -> others
아까 Spring initializr 설정 사이트에서 본 구조와 같다
이름과 패키지명은 하고싶은대로 지어줘도 된다.
Type, Java Version, Language 부분은 한번 정해주면 그 뒤에 생성할때 값이 유지되어있음.
next 후 finish 하면 boot 방식 메이븐 프로젝트 생성됨
pom.xml보면 설정해줬던 것들이 들어가있다.
패키지와 클래스는 자동적으로 생성이 돼 있으며, 실행은 Run As -> Spring Boot App 으로 하였음.
package com.example.ex01;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
/* implements CommandLineRunner를 사용하여
애플리케이션 실행 전에 추가적인 코드를 실행하고 초기화 작업을 수행할 수 있다 ( run() 메서드가 그 역할을 한다. ) */
public class Ex01Application implements CommandLineRunner{
public static void main(String[] args) {
SpringApplication.run(Ex01Application.class, args);
System.out.println("Hello Spring Boot1");
}
// window application 시작 / SpringApplication.run의 실행이 run() 메서드를 먼저 실행시킨다
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println("Hello Spring Boot2");
for(String arg : args) {
System.out.println("arg : " + arg);
}
}
}
프로젝트 생성시 SQL에서 MariaDB Driver 체크 해주고 finish
기존에 설정했던 기록들이 남아있음 ( Lombok과 Spring Boot DevTools처럼 )
pom.xml에 들어가있는 것을 볼 수 있음.
Maven Dependencies에서 확인 가능
package com.example.ex02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//
public class Ex02Application implements CommandLineRunner{
public static void main(String[] args) {
SpringApplication.run(Ex02Application.class, args);
}
// 마리아디비를 사용할 수 있게 기본적인 내용 작성
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
String url = "jdbc:mariadb://localhost:3306/sample";
String user = "root";
String password = "123456";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
System.out.println("연결 성공");
String sql = "select now() as now";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("now"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) try {rs.close();} catch(SQLException e) {}
if(pstmt != null) try {pstmt.close();} catch(SQLException e) {}
if(conn != null) try {conn.close();} catch(SQLException e) {}
}
}
}
라이브러리 추가 원하는 프로젝트 오른쪽 클릭 -> Spring -> Add Starters -> 들어가서 원하는 라이브러리 선택하여 넣어주면 된다. -> 그리고 아래 사진처럼 pom.xml 체크해주면됨 ( 이런식으로 들어간다는 것을 보여주는 창 )
JDBC API는 풀링 쓴다는 것
package com.example.ex03;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Ex03Application implements CommandLineRunner{
public static void main(String[] args) {
SpringApplication.run(Ex03Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println("Hello Spring Boot");
}
}
DataSource dataSource 생성하고 값 뽑아보기
package com.example.ex03;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Ex03Application implements CommandLineRunner{
@Autowired
// DataSource객체는 application.properties 파일의 설정과 연결되어있음.
private DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(Ex03Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println("Hello Spring Boot : " + dataSource);
}
}
HikariCP는 자바 기반의 고성능 JDBC 커넥션 풀 라이브러리
HikariDataSource는 데이터베이스와의 연결을 관리하는 기능을 제공하며, 스프링과 같은 프레임워크에서 데이터베이스 연결 설정을 담당하는 DataSource 인터페이스의 구현체로 사용
: 톰캣처럼 먼저 커넥션을 만들어놓고 그것을 사용하는 라이브러리가 HikariCP로 사용한다는 것 / Spring쪽에서 가지고있는 풀링 / JDBC연결 풀
HiKariCP에서 커넥션 풀(Connection Pool)이 설정된 커넥션의 사이즈만큼의 연결을 허용하며 HTTP 요청에 대해 순차적으로 DB 커넥션을 처리해주는 기능을 수행.
package com.example.ex03;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Ex03Application implements CommandLineRunner{
@Autowired
// DataSource객체는 application.properties 파일의 설정과 연결되어있음.
private DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(Ex03Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println("Hello Spring Boot : " + dataSource);
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 정확한 지칭을 위해 this 사용
conn = this.dataSource.getConnection();
System.out.println("연결 성공");
String sql = "select now() as now";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("now"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) try {rs.close();} catch(SQLException e) {}
if(pstmt != null) try {pstmt.close();} catch(SQLException e) {}
if(conn != null) try {conn.close();} catch(SQLException e) {}
}
}
}
Hikari pool도 가동되는 것을 볼 수 있음.
package com.example.ex03;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;
@SpringBootApplication
public class Ex03Application implements CommandLineRunner{
// @Autowired
// private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
public static void main(String[] args) {
SpringApplication.run(Ex03Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println("Hello Spring Boot : " + jdbcTemplate);
String result = jdbcTemplate.queryForObject("select now() as now", String.class);
// 결과에 대한 result
System.out.println("result : " + result);
}
}
Connection 등 연결할 필요 없이 간단하게 출력할 수 있음.
package com.example.ex03;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;
@SpringBootApplication
public class Ex03Application implements CommandLineRunner{
// @Autowired
// private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
public static void main(String[] args) {
SpringApplication.run(Ex03Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println("Hello Spring Boot : " + jdbcTemplate);
//String result = jdbcTemplate.queryForObject("show databases", String.class);
// 결과에 대한 result
//System.out.println("result : " + result);
List<Map<String, Object>> results = jdbcTemplate.queryForList("show databases");
for(Map<String, Object> result : results) {
System.out.println(result.get("Database"));
}
}
}
위의 코드에서 수정
List<Map<String, Object>> results = jdbcTemplate.queryForList("show tables");
for(Map<String, Object> result : results) {
System.out.println(result.get("Tables_in_sample"));
}
외부입력 - args 사용
우편번호 출력 프로젝트
package com.exam.model1;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class ZipcodeTO {
private String zipcode;
private String sido;
private String gugun;
private String dong;
private String ri;
private String bunji;
}
zipcode 테이블은 project데이터베이스에 있어서 수정해줘야한다.
# MariaDB
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/project
spring.datasource.username=project
spring.datasource.password=1234
package com.example.ex04;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import com.exam.model1.ZipcodeTO;
@SpringBootApplication
public class Ex04Application implements CommandLineRunner{
@Autowired
private JdbcTemplate jdbcTemplate;
public static void main(String[] args) {
SpringApplication.run(Ex04Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
//DAO
//public ArrayList<ZipcodeTO> zipcodeList();
String strDong = "대치";
String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like?";
ArrayList<ZipcodeTO> lists = (ArrayList<ZipcodeTO>) jdbcTemplate.query(
sql, new BeanPropertyRowMapper<ZipcodeTO>(ZipcodeTO.class),strDong + "%");
System.out.println("개수 : " + lists.size());
for(ZipcodeTO to : lists) {
System.out.println(to.getZipcode());
System.out.println(to.getSido());
}
}
}
대치에 대한 정보
package com.example.model1;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class ZipcodeDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public ArrayList<ZipcodeTO> zipcodeList(String strDong) {
System.out.println("jdbcTemplate" + jdbcTemplate);
String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like?";
ArrayList<ZipcodeTO> lists = (ArrayList<ZipcodeTO>) jdbcTemplate.query(
sql, new BeanPropertyRowMapper<ZipcodeTO>(ZipcodeTO.class),strDong + "%");
return lists;
}
}
package com.example.ex04;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import com.example.model1.ZipcodeDAO;
import com.example.model1.ZipcodeTO;
@SpringBootApplication
// model1 패키지를 뒤적해줘 라는 것
@ComponentScan({"com.example.model1"})
public class Ex04Application implements CommandLineRunner{
@Autowired
private ZipcodeDAO dao;
public static void main(String[] args) {
SpringApplication.run(Ex04Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println("dao : " + dao);
System.out.println("dao : " + dao.zipcodeList("개포"));
ArrayList<ZipcodeTO> lists = dao.zipcodeList("개포");
for(ZipcodeTO to : lists) {
System.out.println(to.getZipcode());
System.out.println(to.getSido());
}
}
}
들어간 것 확인
mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis">
<select id="select" resultType="String">
select now() as now
</select>
</mapper>
package com.example.ex05;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class Ex05Application implements CommandLineRunner{
@Autowired
private DataSource dataSource;
@Autowired
// ApplicationContext : 스프링 프레임워크의 컨테이너 역할을 수행 / mybatis 설정파일 가져오기
private ApplicationContext applicationContext;
public static void main(String[] args) {
SpringApplication.run(Ex05Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
/* SqlSessionFactoryBean은 SqlSessionFactory를 생성하기 위한 팩토리 빈.
SqlSessionFactory는 SqlSession을 생성하는 데 사용되며,
SqlSession은 실제로 데이터베이스와의 상호작용을 수행
따라서 SqlSessionFactoryBean을 사용하여 SqlSessionFactory를 생성하고,
이를 통해 SqlSession을 얻어 데이터베이스와의 작업을 수행할 수 있다. */
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
// dataSource를 SqlSessionFactoryBean에 설정 / 데이터베이스 연결을 설정하는 것
sqlSessionFactoryBean.setDataSource(dataSource);
/* setMapperLocations 메서드를 사용하여 (MapperLocations 프로퍼티는 MyBatis의 매퍼 파일(mapper.xml)의 위치를 지정)
applicationContext.getResources("classpath:/mappers/mapper.xml")를 통해
매퍼 파일의 위치를 지정. 이는 MyBatis 매퍼 파일을 로드하기 위한 설정 / ApplicationContext 객체를 사용하여 클래스패스 상의 매퍼 파일의 위치를 가져옴
이렇게 매퍼 파일의 위치를 지정하여 setMapperLocations 메서드에 전달하면 SqlSessionFactoryBean은 해당 위치에서 매퍼 파일을 찾아와서 설정에 활용*/
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/mapper.xml"));
// getObject 메서드를 호출하여 SqlSessionFactory 객체를 생성.
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
/* 생성된 SqlSessionFactory 객체를 사용하여 openSession 메서드를 호출하여 SqlSession 객체를 생성.
openSession(true)은 자동 커밋을 설정하는 옵션 / 커밋 : 데이터베이스 트랜잭션에서 변경된 데이터의 영구 저장을 의미 */
SqlSession sqlSession = sqlSessionFactory.openSession(true);
System.out.println(sqlSession);
// SqlSession 객체를 사용하여 SQL 쿼리를 실행하고 그 결과를 가져오는 부분.
// mapper.xml에 <select id="select"> 인 데이터를 가져오는 것. (id값)
String result = sqlSession.selectOne("select");
System.out.println("result : " + result);
}
}
resource는 전 프로젝트에서 한것 그대로 가져옴
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis">
<select id="select" resultType="String">
select now() as now
</select>
</mapper>
mybatis를 통하여 연결하는 것을 원래는 main쪽에서 직접 써줬던 것을 미리 선언하기 위한 클래스
package com.example.ex06;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DatabaseConfiguration {
@Autowired
private ApplicationContext applicationContext;
/* @Bean으로 등록되어 스프링 애플리케이션이 시작될 때 @Bean이 붙은 메서드들이 실행되면서 빈 객채 생성.
해당 빈 객체는 스프링 컨테이너에 등록이 된다. 한마디로 프로그램 실행시 호출이 됨
DataSource 매개변수는 sqlSessionFactory 메서드가 호출될 때
스프링 컨테이너에 등록된 DataSource 빈 객체(application.properties(DB연결설정 파일))로부터 값을 받아온다 */
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
System.out.println("sqlSessionFactory(DataSource dataSource) 호출");
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(
applicationContext.getResources("classpath:/mappers/mapper.xml"));
// 리턴값은 메서드가 호출되는 시점에 필요한 곳으로 반환이 된다.
return sqlSessionFactoryBean.getObject();
}
/* SqlSessionTemplate : MyBatis의 핵심 클래스 중 하나로, SqlSession을 감싸고 필요한 기능을 제공하는 래퍼 클래스.
SqlSessionTemplate은 데이터베이스와의 상호작용을 단순화하고 편의성을 제공하기 위해 사용 */
/* 메서드의 매개변수로 SqlSessionFactory를 받는 이유 :
SqlSessionTemplate 객체를 생성할 때 SqlSessionFactory가 필요하기 때문 */
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
System.out.println("sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) 호출");
return new SqlSessionTemplate(sqlSessionFactory);
}
}
* 전체적인 코드 흐름
SqlSessionFactory 객체는 sqlSessionFactory() 메서드에서 생성되고,
이를 다른 메서드에서 매개변수로 받아 사용하는 구조.
Spring 컨테이너가 sqlSessionFactory() 메서드를 호출하여 SqlSessionFactory 빈을 생성하고,
이 빈은 SqlSessionTemplate 빈을 생성하기 위한 의존성으로 사용
package com.example.ex06;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Ex06Application implements CommandLineRunner{
@Autowired
private SqlSession sqlSession;
public static void main(String[] args) {
SpringApplication.run(Ex06Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub
System.out.println(" sqlSession " + sqlSession);
String result = sqlSession.selectOne("select");
System.out.println("result : " + result);
}
}
sqlSessionFactory 메서드와 sqlSessionTemplate메서드는 @Bean 어노테이션을 가지고있어서 실행시 제일 먼저 빈 객체가 생성되며 호출되기때문에 제일 먼저 출력되었음.
패키지 분활
com.example.zipcode
ZipcodeApplication.java
main 메서드
dao.zipcodeList() 호출
=> 우편번호가 출력
com.example.cnofig
DatabaseConfiguration.java
com.example.model
ZipcodeTO
ZipcodeDAO
zipcodeList();
web 환경 구성 ...
spring boot
jsp(x)
mvc를 위함이라 controller에서 실행해줘야한다.
Spring Web을 하면 tomcat이 생성된다.
tomcat이 생성된다
package com.example.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Web01Application {
public static void main(String[] args) {
SpringApplication.run(Web01Application.class, args);
}
}
톰캣 실행은 되는 것을 볼 수 있다.
jsp파일을 직접 실행시키는 개념이 아니라 컨트롤러에 의해 실행이 된다.
브라우저에서 index.jsp 입력하면 jsp 파일이 다운로드 된다.
이유는 jsp를 해석할 수 없다는 것. / jsp 해석할 연결이 안되어있다.
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
// 밑의 두 어노테이션으로 사용 가능.
// @Controller
@RestController // @Controller와 @ResponseBody를 합친 것
public class ConfigController {
@RequestMapping("/") // "/" 경로로 들어오는 요청을 처리
@ResponseBody // 컨트롤러 메서드가 반환하는 값을 뷰를 거치지 않고 직접 HTTP 응답의 본문으로 사용
public String index() {
return "Hello html";
}
@RequestMapping("/hello")
@ResponseBody // @ResController가 있으면 생략이 가능하다.
public String hello() {
return "<h1>Hello html</>";
}
}
package com.example.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
@Controller
@SpringBootApplication
public class Web01Application {
public static void main(String[] args) {
SpringApplication.run(Web01Application.class, args);
}
}
ConfigController에서 return값으로 정해준 값들이 출력된다.
main폴더에서 webapp, WEB-INF, views 폴더를 직접 생성해주었음.
설정과 같게 경로를 만들어준 것.
package com.example.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
// 밑의 두 어노테이션으로 사용 가능.
// @Controller
@RestController
public class ConfigController {
@RequestMapping("/hello1")
public ModelAndView hello1() {
return new ModelAndView("hello1");
}
}
form.do - form.jsp
form_ok.do - form_ok.jsp
package com.example.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
// 밑의 두 어노테이션으로 사용 가능.
// @Controller
@RestController
public class ConfigController {
@RequestMapping("/form.do")
public ModelAndView form() {
return new ModelAndView("form");
}
@RequestMapping("/form_ok.do")
public ModelAndView form_ok(HttpServletRequest request) {
System.out.println("data : " + request.getParameter("data"));
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("form_ok");
modelAndView.addObject("data", request.getParameter("data"));
return modelAndView;
}
}
package com.example.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
// 밑의 두 어노테이션으로 사용 가능.
// @Controller
@RestController // ModelAndView
public class ConfigController {
@RequestMapping("/form.do")
public ModelAndView form() {
return new ModelAndView("form");
}
/*
@RequestMapping("/form_ok.do")
public ModelAndView form_ok(HttpServletRequest request) {
System.out.println("data : " + request.getParameter("data"));
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("form_ok"); // 실제 보여질 파일명
// data에 request.getParameter("data") 값이 들어가며, addObject로인해 ModelAndView객체로 들어간다.
modelAndView.addObject("data", request.getParameter("data"));
return modelAndView;
}
*/
// 이건 @Controller로 받아줘야한다. / @RestController는 ModelAndView로
@RequestMapping("/form_ok.do")
public String form_ok(HttpServletRequest request, Model model) {
model.addAttribute("data", request.getParameter("data"));
return "form_ok";
}
}
package com.example.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
@Controller
@SpringBootApplication
public class Web02Application {
public static void main(String[] args) {
SpringApplication.run(Web02Application.class, args);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello form.jsp
<br><br>
<form action="form_ok.do" method="get">
데이터 <input type="text" name="data" />
<input type="submit" value="전송" />
</form>
<form action="form_ok.do" method="post">
데이터 <input type="text" name="data" />
<input type="submit" value="전송" />
</form>
</body>
</html>
form_ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello form_ok.jsp
<br><hr><br>
data : ${ data }
</body>
</html>
데이터베이스 연결 정보 설정
package com.example.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
@Controller
@SpringBootApplication
public class Web02Application {
public static void main(String[] args) {
SpringApplication.run(Web02Application.class, args);
}
}
form에서 데이터 입력 후 출력된 것들
어려우면 우편번호부터 !!
com.example.bootboard
BootboardApplication.java(X)
com.example.controller
BoardController.java(O)
com.example.model1
BoardTO
BoardDAO