Backend - Spring(1)

wlsdnboy·2022년 4월 15일
0

스프링이란?

자바의 웹프레임워크로 자바 언어를 기반으로 사용한다.

프레임 워크란?

프로그램 설계에 있어 미리 구축되어있는 뼈대이다.
자주 쓰는 기능을 모아 놓은 클래스들의 모임이다.

스프링의 특징

  • 의존성 주입(DI) : 프로그램 구성요소간의 의존 구조를 외부 파일에서 정의해준다.
    설정 파일을 분리하기 때문에 유지보수가 쉬워지며 각 구성요소간 결합성이 낮아지게 된다.
    ex) 자바에서 오라클을 사용할 수 있게 해준다.

  • 제어 반전(IoC)
    개발자는 객체를 생성하고 소멸시킨다
    IoC란 객체의 생성 부터 소멸까지 객체 생명주기 관리를 개발자가 하는게 아니라 스프링이 대신 해준다.
    제어권을 개발자가 아닌 스프링에게 있다

  • 관점 지향 프로그래밍(AOP)
    로깅,트랜잭션,보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리 할 수있다
    재사용성을 높여주는 프로그래밍 기법이다.

  • POJO 방식
    java EE 사용할때에 비해 기존 라이브러리를 지원하기 용이하고 객체가 가볍다

스프링 프로젝트 생성

spring mvc 프로젝트를 선택해준다

패키지명을 정해준다

그리고 pom.xml에서 여러 설정을 해준다

pom.xml

maven의 빌드 정보를 가진 파일이다 프로젝트 관리 및 빌드에 필요한 환경설정, 의존성 관리등의 정보를 기술한다

maven

여기서 maven이란 자바 프로젝트를 관리하는 툴로 xml에 라이브러리를 자동적으로 다운받아주거나
프로젝트를 빌드 해준다

lombok,hikari,mybatis등 여러 라이브러리를 추가 시켰다.

  • lombok - 자바의 반복되는 메소드를 어노테이션을 이용해서 자동으로 작성해주는 라이브러리다
    ex) getter,setter,생성자

  • hikaricp - jdbc이다 데이터베이스 커넥션 풀을 관리해준다 필요할 때마다 데이터베이스의 연결하면 시간이 많이 걸리기 때문에 웹 어플리케이션이 실행됨과 동시에 연동할때 데이터베이스와의 연결을 미리 설정해 둔다.

  • mybatis - 오라클 제어를 쉽게 도와준다

kr -> board -> mapper 폴더를 만들고 TimeMapper.xml 파일을 생성한다.


<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

TimeMapper.xml에 위의 코드를 추가한다
mybatis의 유효성을 검사하기 위한 코드같다.

src/test/java 폴더에
kr.board.mapper 패키지를 생성후
TimeMapper Interface를 생성한다

getTime3 메소드를 생성한다

root-context.xml 설정

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<!-- Root Context: defines shared resources visible to all other web components -->
  <!-- [DB 관련 설정 : DB 관련 정보를 커넥션 풀 객체에 담는 설정]-->
  <!-- HikariConfig 빈 등록 -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
     
      <!--변수 설정: property 태그 사용, name="변수 이름" value = "저장 값" -->
		<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="admin"></property>
		<property name="password" value="1234"></property>
	</bean>
	
  	<!-- DataSource 등록: 데이터베이스의 정보들을 포장하고있다-->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
      <!-- 생성자를 통한 의존성 주입-->
		<constructor-arg ref="hikariConfig">

		</constructor-arg>

	</bean>

     <!--마이바티스 주요 객체 sessionFactory클래스 빈등록 -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
      <!-- setter를 통한 의존성 주입 -->
		<property name="dataSource" ref="dataSource"></property>

	</bean>
  <!-- 컴포넌트 자동 스캔 명령 -->
  
	<mybatis-spring:scan base-package="kr.board.mapper" />
	

</beans>

root-context.xml은 mvc 설정과 관련된 여러 처리를 담당하는 설정파일이다.
DAO,VO 그리고 service 등과 같은 파일을 어떻게 사용할 것인가 빈(객체)들을 관리하는 문서이다
다운 받은 라이브러리를 사용하는 곳이고 필요할때 객체를 사용하기 위해 이 문서에 bean태그를 이용해 빈을 등록하고 주입하는 방식으로 사용한다

view와 관련되지 않은 객체를 정의한다
Service.Repository,DB등 비즈니스 로직과 관련된 설정을 해준다

root-context에서 체크를 해줘야 한다

TimeMapperTest 클래스를 만든다


package kr.board.persistence;

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 kr.board.mapper.TimeMapper;
import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j

public class TimeMapperTests {
	@Setter(onMethod_ = @Autowired) //setter에서 사용된 onmethod는 setTimeMapper에 @Autowired를 추가해준다 lombok으로 생성된 클래스에 대한 정보는 이클립스를 통해 확인할 수 있다
	private TimeMapper timeMapper;

	@Test
	public void testGetTime3() {
		log.info("xml 이용 : " + timeMapper.getTime3());
		
        
// timeMapper : 인터페이스
// getTime3 : 메소드 선언.
// 인터페이스를 implements 받아서 자식 클래스를 생성하고 메소드를 오버라이드 하는 처리를
// 스프링 컴파일러가 자동으로 처리.
// getTime3 매칭되는 xml 파일의 mybatis 값을 읽어서 결과를 리턴.

	}

}

junit

junit 라이브러리를 사용하는데
junit 라이브러리는 전체프로젝트를 구동하지않고 코드 테스트를 할 수 있게 해주는 라이브러리다

테스트 코드는 src/test/java ,resources 폴더 안에 사용하면 된다

  • @Test
    테스트를 수행하는 메소드를 지정한다 junit에서는 각각의 테스트가 서로 영향을 주지 않고
    독립적으로 실행되는 것을 지향한다

  • @Ignore
    테스트를 실행하지 않는다

@Before/ @After
테스트 메소드가 실행되기전,후로 실행되는 메소드를 선택한다

@BeforeClass/ @AfterClass
각각의 메소드가 아닌 해당 클래스에서 딱 한번만 수행되는 메소드이다 테스트 메소드의 갯수와 상관없이 딱 한번만 실행된다.

Spring-Test

  • @RunWidth(SpringJUnit4ClassRunner.class)
    ApplicationContext를 만들고 관리하는 작업을 할 수 있도록 Junit의 기능을 확장해준다
    스프링의 핵심 기능인 컨테이너 객체를 생성해 테스트에 사용할 수 있도록 해준다고 보면 된다.

  • @ContextConfiguration(locations = "파일위치")
    스프링 빈 설정 파일의 위치를 지정할 수 있다 굳이 별도로 컨테이너를 추가하지 않고 Bean을 등록해둔 xml 파일을 지정해 컨테이너에서 사용할 수 있도록 해준다 @RunWith 어노테이션은 컨테이너를 생성하겠다는 의미인데 어떤파일을 참조할지 모르는 상황이기 때문에 이 어노테이션을 함께 써줘야 한다

  • @Autowired
    스프링에서 사용하는 것과 같다 자동으로 의존성 주입을 해준다

kr.board.domain 패키지를 만들고
BoardVO 클래스파일을 만든다

BoardVO는 테이블 컬럼의 구조와 값을 반영한다

@Data는 lombok의 어노테이션으로 getter와 setter ,equals, toString 등이 자동 생성된다

src/main/resources 폴더에 kr/board/mapper 폴더안에 BoardMapper.xml을 만든다
BoardMapper.xml은 쿼리 조작을 위한 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="kr.board.mapper.BoardMapper">
<select id="getList" resultType="kr.board.domain.BoardVO">
<![CDATA[
select * from tbl_board where bno > 0
]]>
<!-- xml에서 <> 에 대한 잘못된 해석을 방지. -->
</select>
</mapper>

cdata는 해당 영역을 단순한 문자로 인식한다

src/main/java에서 kr/board/mapper 패키지 아래에 BoardMapper.java 인터페이스를 생성한다


package kr.icia.mapper;
import java.util.List;
import kr.icia.domain.BoardVO;
public interface BoardMapper {

public List<BoardVO> getList();
}

src/test/java 에서 kr.board.mapper 패키지 아래에 BoardMapperTests.java에


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardMapperTests {
@Setter(onMethod_ = @Autowired)
private BoardMapper mapper;
@Test
public void testGetList() {
mapper.getList().forEach(board -> log.info(board));
// 향상된 for : 배열과 배열 1개를 담을 변수
// 람다식 : -> 를 기준으로 좌항은 전달값 , 우항은 처리
// 목록은 게시물 여러개(배열), 그중 1개를 board 에 담은 다음에
// 해당 내용을 로그로 출력. 배열 원소가 끝날때 까지 반복.
}
}

https://yeahajeong.tistory.com/51
https://codevang.tistory.com/259
참고 사이트

profile
초보 개발자

0개의 댓글