Spring Boot

준동이·2023년 6월 7일
0

💡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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN