💡Spring Framework

=> 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	



➖➖➖➖➖➖➖➖➖➖➖➖



💡Spring boot

이클립스 실행 은
C:\java\boot-workspace 로 이클립스 실행 -> Help -> Eclipse Marketplace -> sts 검색 -> 아래 사진 다운 -> 다운 다 되면 Restartnow 해주면 된다.


그럼 위에 Boot Dashboard 아이콘이 생김



Spring Boot 프로젝트 생성

new -> others


아까 Spring initializr 설정 사이트에서 본 구조와 같다


이름과 패키지명은 하고싶은대로 지어줘도 된다.
Type, Java Version, Language 부분은 한번 정해주면 그 뒤에 생성할때 값이 유지되어있음.



next 후 finish 하면 boot 방식 메이븐 프로젝트 생성됨


pom.xml보면 설정해줬던 것들이 들어가있다.


패키지와 클래스는 자동적으로 생성이 돼 있으며, 실행은 Run As -> Spring Boot App 으로 하였음.



실행해보기

Ex01Application 클래스

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 템플릿 연결

프로젝트 생성

JDBC API는 풀링 쓴다는 것



application.properties

스프링부트에 모든 환경을 설정하는 곳


데이터베이스 접속에 관한 정보를 넣어줌



실행

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);
	}

}

HikariDataSource / HikariCP(CP는 커넥션 풀)

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도 가동되는 것을 볼 수 있음.



JdbcTemplate로 데이터 가져오기

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 사용
	우편번호 출력 프로젝트

com.example.model1 - ZipcodeTO

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;
}



application.properties

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



Ex04Application 클래스

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());
		}
	}
}

대치에 대한 정보



DAO로 우편번호 만들어보기



model1 - ZipcodeDAO

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;
	}
}



Ex04Application 클래스

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());
		}
	}
}



➖➖➖➖➖➖➖➖➖➖➖➖



💡Mybatis 설정

프로젝트 생성


들어간 것 확인



mybatis는 mapper가 필요

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>



Ex05Application 클래스

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);
		
	}

}



➖➖➖➖➖➖➖➖➖➖➖➖



💡Mybatis 데이터를 가져오는 소스를 외부에 정의하고 main 클래스에서는 사용만 하기

resource는 전 프로젝트에서 한것 그대로 가져옴



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>



DatabaseConfiguration - 데이터를 가져오는 소스

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 빈을 생성하기 위한 의존성으로 사용



Ex06Application 클래스

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 project로 만들기

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);
	}

}


톰캣 실행은 되는 것을 볼 수 있다.



static 폴더에 html, jsp 파일 생성 후 실행

index.html - 정상출력



index.jsp - jps 해석X / jsp는 controller에 의해 실행됨

jsp파일을 직접 실행시키는 개념이 아니라 컨트롤러에 의해 실행이 된다.

브라우저에서 index.jsp 입력하면 jsp 파일이 다운로드 된다.
이유는 jsp를 해석할 수 없다는 것. / jsp 해석할 연결이 안되어있다.



컨트롤러



jsp를 하기위한 설정 - pom.xml에 추가



controller - ConfigController

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</>";
	}
}



controller - Web01Application 클래스

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);
	}
	
}

실행하여 톰캣서버 활성화 후 url 입력

ConfigController에서 return값으로 정해준 값들이 출력된다.



JSP로 된 것을 요청하기

jsp가 불리워질 공간에 대해 먼저 설정해야한다.



application.properties에서 경로 설정 - view페이지 설정

main폴더에서 webapp, WEB-INF, views 폴더를 직접 생성해주었음.
설정과 같게 경로를 만들어준 것.



views폴더에 hello1.jsp 파일 생성




controller - ConfigController 수정

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



controller - ConfigController

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";
	}
	
}



controller - Web02Application

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.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.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>



JDBC 연결

Spring -> Add Starters에서 Mariadb 라이브러리 추가





application.properties

데이터베이스 연결 정보 설정



controller - ConfigController 추가



controller - Web02Application 클래스 ( 실행 )

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에서 데이터 입력 후 출력된 것들



➖➖➖➖➖➖➖➖➖➖➖➖



💡JdbcTemplate로 단순게시판 구현

패키지 분리해서 해보기

어려우면 우편번호부터 !!

패키지 구성

com.example.bootboard
			BootboardApplication.java(X)
            
com.example.controller
			BoardController.java(O)
            
com.example.model1
			BoardTO
            BoardDAO
profile
개발자 꿈나무

0개의 댓글