스프링 기초(인강 보충)

bitna's study note·2022년 7월 5일

스프링

목록 보기
10/54

7월 5일
쌤 바뀌고 엉망진창...하...수업을 듣는데, 집와서 따로 보충을 해야함...코드만 그대로따라 치고 오는거 같다.

여튼...학원친구가 선생님 강의안이랑 똑같은 유튜브 강의 발견해서 듣고 있는데,
같은 ppt다른설명...유튜브에 나의 선생님이 계셨네 눙물눙물...선생님 보고싶었어요 속시원하게 알려주쎄여...

1.xml파일
root-context.xml파일은 스프링 설정에 관한 파일
servlet-context.xml파일은 웹에 관한 설정에 관한 파일
필요시 설정파일을 만들어 추가해줄수도 있음
pom.xml파일은 전체 설정과 쓰고자 하는 라이브러리의 설정할때 필요

2.의존성 주입
개발자 입장에서 의존성 주입이라
나는 내가만든 코드만 신경쓰고 다른 객체가 필요시 필요하다고 말하면 된다.
그러면 스프링이 듣고 객체를 주입해준다.
자바에서는 객체를 코드로 직접 관리를 했는데, 스프링은 객체들을 가지고 있어서 스프링이 관리 해줌

스프링의 중요한 특징은 객체지향을 만들어주는 프레임워크이다. 의존성을 주입해주는게 중요한 특징이다.

스프링에서 이렇게 관리를 해주기 위해서는 빈을 등록 해야함.

그렇다면 어떤 객체를 빈으로 등록 해주나?!
오래 살아남아야하고 오랫동안일을 해야하는 객체는 스프링의 빈으로 등록 해야한다.

xml을 설정해서 빈을 등록하는 방법도 있고, 어노테이션으로 등록 하는 방법도 있다.

아래 의존성 주입 테스트 하기전에 poom.xml에 라이브러리 설정하기 그거는 7월2~3일 부분 참고

(1)어노테이션으로 빈등록 하기
root-context 에 component 설정하기
왜? 스프링이 component가 있으면 빈으로 등록해달라는 설정

<context:component-scan base-package="com.keduit.sample"></context:component-scan>

Chef class만들기

package com.keduit.sample;

import org.springframework.stereotype.Component;
import lombok.Data; //생성자, toString, getter & setter 를 생성해줌

@Component //이게 있음 스프링이 관리객체(즉, 빈으로) 등록 해줌
@Data
public class Chef {

}

Restaurant 객체 만들어줌
의존성 주입은 4가지가 있음
-Setter 주입=>@Setter(onMethod_=@Autowired)
세터메서드를 스프링이 가지고 있는데, Setter로 설정해주고 @Autowired로 필드주입
-생성자 주입=>@AllArgsConstructor
-필드 주입 => @Autowired
-final 주입 =>필드에 final써주고 @RequiredArgsConstructor

package com.keduit.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.Data;
import lombok.Setter;
import lombok.ToString;

@Component //스프링아 빈으로 등록해죠
@ToString
public class Restaurant {
	
	@ //스프링아 chef 객체좀 주입해줘
	private Chef chef;
}

(2)의존성 확인
src>test>java 테스트 코드 만들기

package com.keduit.sample;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.beans.factory.annotation.Autowired;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")// test할때 설정파일을 읽어내는 경로
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class SampleTest {
	
	@Autowired
	private Restaurant restaurant;
	
	@Test
	public void testExist() {
		log.info(restaurant); //log.info 자체는 lombok 이 만들어줌
		log.info("--------------------------");
		
	}

}

다른 코드로 의존성 주입 실습하기

package com.keduit.sample;

import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

@Component
@ToString //lombok 기능, ToString을 자동으로 만들어줌
//@AllArgsConstructor 생성자 안만들고 객체가 하나만 주입될때쓰임 -방법2
@RequiredArgsConstructor //필드에 final 써주고 어노테이션 추가, 최근많이 쓰임-방법3
public class SampleHotel {
	
	//객체 선언
//	private Chef chef;
	private final Chef chef;
	
	//생성자 만들어 주입-방법1
//	public SampleHotel(Chef chef) {
//		super();
//		this.chef=chef;
//	}	
	
}
package com.keduit.sample;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.beans.factory.annotation.Autowired;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class SampleTest {
	
	@Autowired
	private SampleHotel sampleHotel;
	
	@Test
	public void testHotel() {
		log.info(sampleHotel);
	}

}

3.JDBC 드라이버 연결

package com.keduit.sample;

import java.sql.Connection;
import java.sql.DriverManager;

import org.junit.Test;

import lombok.extern.log4j.Log4j;

@Log4j
public class JDBCTest01 {

	@Test
	public void testConnection() throws Exception {
		
		//드라이버가 정상적으로 로딩이 되었나 체크
		Class a= Class.forName("oracle.jdbc.driver.OracleDriver");	
		log.info(a);
		
		//DB연결 테스트
		Connection conn= DriverManager.getConnection(
				"jdbc:oracle:thin:@localhost:1521:xe", //url
				"scott",//id
				"tiger"//비번
				);
		log.info(conn);
		
		conn.close();
	}
	
}

4.HikariCP설정
ConnectionPool의 라이브러리중 하나인 HikariCP 이다.

(1)라이브러리를 가져와야 하므로 메이븐에서 HikariCP 복붙 pom.xml에 붙여주기

(2)빈으로 등록하여 스프링이 관리해줘야 하므로 root-context 설정

//xml로 빈 설정하기
//스프링에 hikariConfig빈으로 등록 해줌
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
     <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
     <property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:xe"></property>
     <property name="username" value="scott" ></property>
     <property name="password" value="tiger"></property>
  	 </bean>
 
 //스프링에 dataSource 빈으로 등록 해줌
 	  <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
	    <constructor-arg ref="hikariConfig"></constructor-arg> //생성자 만들기 hikariConfig를 참조하여 생성자를 만들어죠->생성자로 빈등록 해줌
	  </bean>
     

언제 xml로 빈을 설정하고 언제 어노테이션으로 빈을 설정하는가??
소스코드가 없으면 어노테이션을 못건다. 그때 xml로 설정한다.

(3)HikariCP 커넥션이 잘 연결 되었는지 테스트 한다.

package com.keduit.sample;

import java.sql.Connection;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class DataSourceTest01 {

	@Autowired
	private DataSource ds;
	
	@Test
	public void testConnection() {
		try(Connection conn=ds.getConnection()){
			log.info(conn);
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}

5.MyBatis
스프링<->MyBatis<->DB
MyBatis는 스프링과 DB연결을 해줌
SQL을 그대로 쓸수있고, JDBC의 try-catch, close()등을 관리 해준다.
SQL Mapping 프레임워크

좀더 간결하게 쓰기위해서
스프링<->MyBatis-spring<->MyBatis<->DB

MyBatis는 SqlSessionFactory를 만들어서 동작시킴
Connection을 Session 이라고 부르기도함.
실제로 Sql을 작업하는 객체를 SqlSession 이라고하는데, SqlSessionFactory는 SqlSession 를 만드는객체다.

(1)root-context 설정

//스프링에 sqlSessionFactory빈으로 등록 해줌
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	  	<property name="dataSource" ref="dataSource"></property> //dataSource를 참조하여 sqlSessionFactory빈을 만들어죠
	  </bean>

(2)sqlSessionFactory 잘 만들어 졌는지 확인

package com.keduit.sample;

import static org.junit.Assert.fail;

import java.sql.Connection;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.keduit.mapper.TimeMapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class DataSourceTest {
	
	@Autowired
	private SqlSessionFactory sqlsessionfactory;
	
	@Test
	public void testMyBatis() {
		try(SqlSession session = sqlsessionfactory.openSession(); //sqlsessionfactory 에서 session객체 생성
			Connection conn=session.getConnection()){ //session객체를 이용하여 데이터풀연결
			log.info(session);
			log.info(conn);
		}catch (Exception e) {
			fail(e.getMessage());
		}
	}

6.Mapper
(1)root-context 설정
Namespaces 에서 MyBatis를 설정해주면 MyBatis태그를 사용할수 있으며, MyBatis태그 자동완성기능이 있음

//스프링아 mybatis 관련된 패키지 경로는 ...아여, 여기로가서 찾아죠
<mybatis-spring:scan base-package="com.keduit.mapper"/>

(2)sqlSessionFactory 잘 만들어 졌는지 확인

mapper 인터페이스 만들기

package com.keduit.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

//dual 은 범위 테이블
@Select("select sysdate from dual")
public String getTime(); //주입 받은 방식, 위에 @Select에 sql코드를 갖고 있다.
}
package com.keduit.sample;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.keduit.mapper.TimeMapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야 
public class TimeMapperTest {
	
	@@Autowired
	private TimeMapper timeMapper; 
	
	@Test
	public void testgetTime1() {
		log.info(timeMapper.getClass().getName());
		log.info(timeMapper.getTime()); 
	}
}

7.xml Mapper+Mapper interface

(1)mapper 인터페이스 만들기

package com.keduit.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {

//com.keduit.mapper.TimeMapper.getTime2 풀네임이고 하나의 유니크한 ID로 SqlSession을 동작시킬때 풀네임을 가지고 동작시킨다.
public String getTime2(); //root-context.xml에 sql코드를 갖고 있다.

}

(2)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"> //이문서에 무엇이 들어가고 인들어가고를 얘기해주는게 dtd 기준으로 하며, dtd 는 자동완성 기능이 있음 
<mapper namespace="com.keduit.mapper.TimeMapper">
	<select id="getTime2" resultType="String">
	SELECT sysdate from dual
	</select>
</mapper>

namespace=Mapper 인터페이스 경로
id=인터페이스 메서드명 (동일해야함!)

먼저인터페이스에 가서 sql문을 찿고 없으면 Mapper.xml을 뒤져서 실행한다.

resultMap=>Mapping할때 쓰임
resultType=>지정한 타입의 객체로 만들어죠

8.log4jdbc
MyBatis는 내부적으로 PreparedStatement를 이용하기 때문에 보기 쉽게 SQL문을 보기 위함

profile
좋은개발자가 되기위한 삽질기록 노트

0개의 댓글