김경현

KIMGYUNGHYUN . COM

스프링 이해

댓글 0

기술연구

2021. 2. 12.

안녕하세요.

 

기술이 공유되지 않으면 미래의 사회는 지금보다 더욱 폐쇄적이고 불평등한 사회가 될 것입니다. 카피레프트(copyleft)는 개인의 지적재산권을 중시하는 기존의 카피라이트(copyright)에 대항해 사회적 공유를 강조하는 정신이자 운동입니다. DIY연구소는 카피레프트(copyleft) 정신과 4차 산업혁명 기술의 확산을 위하여 연구한 내용을 무료로 배포하고 있습니다. 오늘은 아들의 웹프로그램을 이용한 '스프링 이해' 내용을 공유합니다.

 

[1] [2] [3] [4]

 

 

 

☞ 3D프린터 설계제작 (교보문고) 
☞ 4차 산업 설계제작 (교보문고)

 

DIY연구소 김경현 배상 (010 8604 6802)

 

 

[교육내용]

 

☞ 1. 3D프린터 설계제작

☞ 2. 3D프린터 프로그램
☞ 3. 3D프린터 의수제작 
☞ 4. 3D프린터 Core XY 구동방식과 조립 
☞ 5. 3D프린터 Prusa i3 조립 
☞ 6. 3D프린터 Prusa i3 배선
☞ 7. 3D프린터 전기조립 기초
☞ 8. 3D프린터 Fun i3 조립
☞ 9. 3D프린터 오픈소스 RepRap
☞ 10. 3D프린터 20만원대 교육용 개발
☞ 11. 3D프린터 전기자전거 개발 
☞ 12. 3D프린터 원노즐 듀얼 개발 
☞ 13. 3D프린터 모델링 프로그램 라이노 
☞ 14. 3D프린터로 나만의 조명 만들기
☞ 15. 3D프린터로 홀로그램 만들기
☞ 16. 3D프린터 설계제작 공유
☞ 17. 3D프린터로 드론 만들기
☞ 18. 스크래치
☞ 19. 3D프린터 대형개발-콘크리트
☞ 20. 3D프린터로 애완동물 자동급식기 만들기

☞ 21. 아두이노 
☞ 22. 안드로이드앱
☞ 23. 3D프린터로 동물보호
☞ 24. 3D프린터로 인공지능 로봇 만들기
☞ 25. 3D프린터로 에어콘 만들기
☞ 26. 4차산업 설계제작
☞ 27. 3D프린터로 인공지능 로봇 만들기
☞ 28. 로봇머리 전기제어-이론
☞ 29. 로봇머리 전기제어-제작 
☞ 30. 라즈베리파이 
☞ 31. 로봇제어를 위한 AI 인공지능
☞ 32. 로봇제어를 위한 AI 스마트미러
☞ 33. 로봇제어를 위한 블루투스
☞ 34. 로봇제어를 위한 음성제어
☞ 35. 스마트공장
☞ 36. 로봇 원격제어-특허
☞ 37. 로봇 스타트업 투자제안서-영문
☞ 38. 로봇 스타트업 투자제안서-한글
☞ 39. 3D프린터로 로봇 만들기-기계 
☞ 40. 3D프린터로 로봇 만들기-전기
☞ 41. 앱인벤터
☞ 42. 앱인벤터로 애니메이션 만들기
☞ 43. 앱인벤터로 스마트폰 제어하기
☞ 44. 로봇제어를 위한 교육앱
☞ 45. 로봇제어를 위한 교육앱-전화걸기
☞ 46. 로봇제어를 위한 교육앱-비만도

☞ 47. 로봇제어를 위한 교육앱-카메라 
☞ 48. 로봇제어를 위한 교육앱-플레이어
☞ 49. 로봇제어를 위한 교육앱-캔버스
☞ 50. 로봇제어를 위한 교육앱-위치센서
☞ 51. 로봇제어를 위한 교육앱-뱡향센서 
☞ 52. 로봇제어를 위한 교육앱-메시지 
☞ 53. 로봇제어를 위한 교육앱-대기오염 
☞ 54. 로봇제어를 위한 교육앱-음성제어
☞ 55. 로봇제어를 위한 딥러닝-인공지능
☞ 56. 로봇제어를 위한 텐서플로-인공지능
☞ 57. 로봇제어를 위한 파이썬-코딩언어
☞ 58. 로봇제어를 위한 티처블머신-인공지능
☞ 59. 인공지능 주식투자 프로그램 개발
☞ 60. 인공지능 딥러닝-주식
☞ 61. 인공지능 노이즈-주식
☞ 62. 인공지능 빅데이터 분석 
☞ 63. 인공지능 빅데이터 크롤링 
☞ 64. 인공지능 빅데이터 매크로

☞ 65. 웹프로그래밍-HTML, CSS, JAVASCRIPT

☞ 66. 웹프로그래밍-JSP 2.3 
☞ 67. 웹프로그래밍-SPRING

 

 

[배달앱 화면]

 

 

■ 스프링 개발환경 구축

 

스프링을 학습하는 단계는 대부분 웹 프로그래밍을 학습한 후 진행하게 된다. 스프링은 설정이 꽤 복잡하기 때문에 흔히들 '설정이 반이다' 라고 말할 정도로 설정의 난이도 때문에 진입장벽이 높을 때가 많다.  

 

□ JDK 1.8 버전 설치 : JDK 10 버전은 Tomcat 등의 연동문제로 권장하지 않는다.

□ STS (Eclipse) 설치 및 프로젝트 생성

□ Tomcat 설치 및 연동

□ 오라클 데이터베이스 / SQL Developer 설치 및 설정

□ 스프링 프로젝트 생성 및 라이브러리 추가

□ MyBatis / mybatis-spring 설정

□ 스프링 MVC 개발 설정

 

 

스프링 구동원리

 

 

스프링 프로젝트

 

□ 스프링 프로젝트 만드는 순서

 

1. 좌측의 Project Explrer 에서 우클릭 -> New -> Other ->

Spring Legacy project -> Next -> Project name 정한 후 -> Spring MVC Projcet 클릭 -> Next ->

프로젝트 주소설정 -> Finish

 

□ 스프링 프로젝트 서버에서 작동시키는 순서

 

1. 좌측의 Project Explrer 에서 우클릭 -> Run As -> Run on Server 클릭 -> Tomcat v0.0 Server at localhost 클릭 -> Finish -> Home.jsp 열림

 

□ 스프링 프로젝트 작동 순서

 

1. web.xml

/WEB-INF/spring/appServlet/servlet-context.xml을 참조 (xml 파일 안에 정의된 객체들을 로딩한다.)

 

2. servlet-context.xml

프로젝트 주소를 스캔 (<context:component-scan base-package="주소값" />)

 

3. HomeController.java

@Controller과 @RequestMapping

return "home"

 

4. servlet-context.xml

prefix = /WEB-INF/views/

이후 return 값인 home

suffix = .jsp

 

5. home.jsp 구동

 

 

스프링 화면

 

□ 스프링 프로젝트 만드는 순서

 

1. 좌측의 Project Explrer 에서 우클릭 -> New -> Other ->

 

 

Spring Legacy project -> Next -> 

 

 

Project name 정한 후 -> Spring MVC Projcet 클릭 -> Next ->

 

 

프로젝트 주소설정 -> Finish

 

 

□ 스프링 프로젝트 서버에서 작동시키는 순서

 

1. 좌측의 Project Explrer 에서 우클릭 -> Run As -> Run on Server 클릭 -> 

 

 

Tomcat v0.0 Server at localhost 클릭 -> Finish -> 

 

 

Home.jsp 열림

 

 

□ 스프링 프로젝트 작동 순서

 

1. web.xml

/WEB-INF/spring/appServlet/servlet-context.xml을 참조 (xml 파일 안에 정의된 객체들을 로딩한다.)

 

 

2. servlet-context.xml

프로젝트 주소를 스캔 (<context:component-scan base-package="주소값" />)

 

 

3. HomeController.java

@Controller과 @RequestMapping

return "home"

 

 

4. servlet-context.xml

prefix = /WEB-INF/views/

이후 return 값인 home

suffix = .jsp

 

 

5. home.jsp 구동

 

 

□ web.xml 설정

 

 

□ 프로젝트 네이밍 규칙

 

xxController : 스프링 MVC에서 동작하는 Controller 클래스를 설계할 때 사용

 

xxService : 비즈니스 영역(고객이 원하는 요구 사항을 반영하는 계층)을 담당하는 인터페이스

xxServiceimpl : 인터페이스를 구현한 클래스

 

xxDAO, xxrepository : DAO(Data-Access-Object)나 repository(저장소)라는 이름으로 영역을 따로 구성하는 것이 보편적이다. (여기서는 MyBatis의 Mapper 인터페이스를 활용)

 

DTO(Data-Transfer-Object), VO(Value-Object) : 데이터를 담고 있는 객체를 의미

DTO 는 주로 데이터 수집의 용도(ex_웹 화면에서 로그인하는 정보)

VO 는 주로 읽기 전용의 목적이 강하고, 데이터 자체도 불변하게 설계하는 것이 정석(여기서는 VO를 활용)

 

□ pom-xml

 

pom.xml 파일에 프로젝트 관리 및 빌드에 필요한 환경 설정, 의존성 관리 등의 정보들을 기술

 

<?xml version="1.0" encoding="UTF-8"?>

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>www.spring</groupId>

<artifactId>com</artifactId>

<name>SpringPjtPrototype</name>

<packaging>war</packaging>

<version>1.0.0-BUILD-SNAPSHOT</version>

<properties>

<java-version>1.8</java-version>

<org.springframework-version>5.2.1.RELEASE</org.springframework-version>

<org.aspectj-version>1.6.10</org.aspectj-version>

<org.slf4j-version>1.6.6</org.slf4j-version>

</properties>

<dependencies>

 

<!-- Spring -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${org.springframework-version}</version>

<exclusions>

 

<!-- Exclude Commons Logging in favor of SLF4j -->

<exclusion>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

</exclusion>

</exclusions>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>${org.springframework-version}</version>

</dependency>

 

<!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>

 

<!-- Rest json xml -->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.10.1</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.dataformat</groupId>

<artifactId>jackson-dataformat-xml</artifactId>

<version>2.10.1</version>

</dependency>

<dependency>

<groupId>com.google.code.gson</groupId>

<artifactId>gson</artifactId>

<version>2.8.6</version>

</dependency>

 

<!-- HikariCP -->

<dependency>

<groupId>com.zaxxer</groupId>

<artifactId>HikariCP</artifactId>

<version>2.7.4</version>

</dependency>

 

<!-- Mybatis -->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.4.6</version>

</dependency>

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>1.3.2</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>${org.springframework-version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>${org.springframework-version}</version>

</dependency>

 

<!-- Lombok -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.10</version>

<scope>provided</scope>

</dependency>

 

<!-- Logging -->

<dependency>

<groupId>org.bgee.log4jdbc-log4j2</groupId>

<artifactId>log4jdbc-log4j2-jdbc4</artifactId>

<version>1.16</version>

</dependency>

 

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>${org.slf4j-version}</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>jcl-over-slf4j</artifactId>

<version>${org.slf4j-version}</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>${org.slf4j-version}</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.17</version>

<exclusions>

<exclusion>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

</exclusion>

<exclusion>

<groupId>javax.jms</groupId>

<artifactId>jms</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jdmk</groupId>

<artifactId>jmxtools</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jmx</groupId>

<artifactId>jmxri</artifactId>

</exclusion>

</exclusions>

</dependency>

 

<!-- @Inject -->

<dependency>

<groupId>javax.inject</groupId>

<artifactId>javax.inject</artifactId>

<version>1</version>

</dependency>

 

<!-- Servlet -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.2</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

 

<!-- Test -->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

<scope>test</scope>

</dependency>

 

<!-- Spring JUnit Test -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</artifactId>

<version>${org.springframework-version}</version>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<artifactId>maven-eclipse-plugin</artifactId>

<version>2.9</version>

<configuration>

<additionalProjectnatures>

<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>

</additionalProjectnatures>

<additionalBuildcommands>

<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>

</additionalBuildcommands>

<downloadSources>true</downloadSources>

<downloadJavadocs>true</downloadJavadocs>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.5.1</version>

<configuration>

<source>1.8</source>

<target>1.8</target>

<encoding>utf-8</encoding>

<compilerArgument>-Xlint:all</compilerArgument>

<showWarnings>true</showWarnings>

<showDeprecation>true</showDeprecation>

</configuration>

</plugin>

<plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>exec-maven-plugin</artifactId>

<version>1.2.1</version>

<configuration>

<mainClass>org.test.int1.Main</mainClass>

</configuration>

</plugin>

</plugins>

</build>

</project>

 

 

□ 오라클 1

 

 

□ 오라클 2

 

 

□ 오라클 3

 

 

□ root-context

 

 

□ 데이터베이스 연결 (root-context)

 

데이터베이스 사용하기 위한 Spring 설정

 

1. 데이터베이스 연결 (JDBC)

2. 다중 데이터베이스 연결(커넥션 풀 [Connection Pool])

3. 자동으로 데이터베이스 연결 및 닫기 (MyBatis)

 

□ log4jdbc.log4j2.properties

 

MyBatis를 사용해서 개발하다가 보면 가끔 잘못된 SQL이나 잘못된 속성의 이름으로 인해서 예외가 발생하는 경우가 종종 있다. 이런 경우를 대비해서 MyBatis의 로그를 보다 자세히 조사할 수 있도록 로그를 설정해 주는 것이 좋다.

 

Log4jdbc-log4j2라는 라이브러리를 이용하면, 기존의 jdbc datasource보다 더 상세한 로그를 콘솔에서 확인할수 있다. 다만 log4jdbc를 이용하는 경우 속도가 기존보다 저하될수 있고, 데이터베이스에 따라서 지원되지 않는 경우도 있으므로 설정 후에 정상적 동작을 반드시 확인해야 한다.

 

1. pom.xml에 log4jdbc-log4j2 라이브러리를 추가 (했음)

2. root-context.xml파일에 dataSource를 수정 (<property> value에 log4jdbc.sql 주소 씀.)

3. src/main/resource 경로에 log4jdbc.log4j2.properties 파일을 생성 후 아래의 내용을 입력

 

①상단 메뉴 중 [File] => [New] => [Other] 선택

 

②[General] (위쪽에 있음) => [Untitled Text File] 선택 후 [Finish] 선택

 

③[Untitled 번호] 창에 아래의 코드를 추가 후 저장(Ctrl+s)

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

④저장 경로 지정(자신의 프로젝트 선택 => src => main => resources을 선택) 후

File name = " log4jdbc.log4j2.properties " 로 입력 후 [OK] 선택

 

DataSource와 MyBatis 가 연결됐는지 확인하기 위해 Tests 클래스를 테스트 패키지에 추가

 

 

□ log4jdbc1

 

①상단 메뉴 중 [File] => [New] => [Other] 선택

 

 

□ log4jdbc2

 

②[General] (위쪽에 있음) => [Untitled Text File] 선택 후 [Finish] 선택

 

 

□ log4jdbc3

 

③[Untitled 번호] 창에 아래의 코드를 추가 후 저장(Ctrl+s)

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

④저장 경로 지정(자신의 프로젝트 선택 => src => main => resources을 선택) 후

File name = " log4jdbc.log4j2.properties " 로 입력 후 [OK] 선택

DataSource와 MyBatis 가 연결됐는지 확인하기 위해 Tests 클래스를 테스트 패키지에 추가

 

 

□ JDBC Tests1

 

 

□ JDBC Tests2

 

MyBatis 가 연결됐는지 확인하기 위해 JDBCTests.java 를 테스트 패키지에 추가

 

Java Resources -> src/test/java -> www.spring.com -> 우클릭 -> New -> Class -> Name : JDBCTests.java  

 

package www.spring.com;

 

import static org.junit.Assert.fail;

 

import java.sql.Connection;

import java.sql.DriverManager;

 

import org.junit.Test;

 

import lombok.extern.log4j.Log4j;

 

@Log4j

public class JDBCTests {

static {

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (Exception e) {

e.printStackTrace();

}

}

 

@Test

public void testConnection() {

 

try(Connection con =

DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:데이터베이스 명(SID)",

"오라클 아이디",

"오라클 비밀번호")){

log.info(con);

} catch (Exception e) {

fail(e.getMessage());

}

}

}

 

 

□ JDBC Tests3

 

 

□ Data Source Tests1

 

 

□ Data Source Tests2

 

DataSource 가 연결됐는지 확인하기 위해 DataSourceTests.java 를 테스트 패키지에 추가

 

Java Resources -> src/test/java -> www.spring.com -> 우클릭 -> New -> Class -> Name : DataSourceTests.java

 

package www.spring.com;

 

import static org.junit.Assert.fail;

 

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

import lombok.extern.log4j.Log4j;

 

@RunWith(SpringJUnit4ClassRunner.class)

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

@Log4j

public class DataSourceTests {

 

@Setter(onMethod_ = { @Autowired })

private DataSource dataSource;

@Test

public void testConnection() {

try (Connection con = dataSource.getConnection()){

log.info(con);

} catch (Exception e) {

fail(e.getMessage());

}

}

}

 

□ VO 설정 1

 

 

□ VO 설정 2

 

 

□ VO 설정 3

 

 

□ mybatis (root-context-xml)

 

 

□ Board Mapper1

 

 

□ Board Mapper2

 

 

□ Mapper.xml1

 

 

□ Mapper.xml2

 

 

□ Mapper-xml

 

src/main/resources 내에 패키지와 동일한 www / spring / com / board / mapper 단계의 폴더를 생성하고 XML 파일을 작성 (파일의 폴더 구조나 이름은 무방하지만 패키지와 클래스 이름을 동일하게 해주면 나중에 찾기 쉽다.)

 

□ Mapper.xml3

 

 

□ Mapper.xml4

 

 

□ Test

 

test.zip
0.09MB

 

□ DDL

 

 

□ Board Mapper-xml

 

 

□ Board Service

 

 

□ Board Service impl

 

 

□ Board Controller

 

 

□ home-jsp

 

 

□ list All Board-jsp

 

 

□ list All Board-jsp

 

 

 

화면구성 & 코드

 

1. 화면구성

 

□ 음식점앱 view 1

 

 

□ 음식점앱 view 2

 

 

□ 음식점앱 view 3

 

 

□ 음식점앱 view 4

 

 

□ 음식점앱 view 5

 

 

□ 음식점앱 view 6

 

 

□ 음식점앱 view 7

 

 

□ 음식점앱 view 8

 

 

(끝)

 

 

 

사업자 정보 표시
| | | 사업자 등록번호 : -- | TEL : -- | 사이버몰의 이용약관 바로가기