본문 바로가기

국비과정/Spring

20230712 _[28일차]_01. Spring 맛보기

Spring version 3, 4, 5 까지 있는데

지금 한국에서는 version 3 만 사용

자바 버전 변경

 (아래 Problems 창의 Errors 제거됨!)

 


jul12에서 마우스 우클릭- new에 보면 두종류의 project가 있는데

- spring legacy project  

- spring stater project (스프링부트, 위에꺼의 간략화버전)

 

우리는 spring legacy project   먼저 배울거

프로젝트 생성

 

MVC 이미 설치되어 있어서 앞쪽 화살표 없음

이제 내 코드네임으로 패키지 만들기

점이 두개면 안됨 ㅠㅠ 잘못캡쳐

 kr.co.phyho.web 으로 해도됨 (도메인이랑 반대방향)

앞에서 뒤로 갈수록 큰 -> 작은 

 

 

잠깐 파일들 위치 살펴보자면 

 

( pdf 참고 )

HomeController 는 여기에 있어야함

~~ . java 로 끝나는 파일들은 전부 이 패키지 아래에 있어야함 (DTO, DAO 등등)

 

 

자바 내부에 파일들(자바에서 기본제공하는 것들)

스프링도 내부파일에 있음

 

 

자바 외부 파일들

요렇게 필요한 내부/외부 파일들이 전부 들어있기 때문에

(실행환경이 세팅되어 있기 때문에)

편하게 사용만 하면됨!!!


[ web.xml ] 열어보면

 

xml설정

아래쪽 코드들은 각종 설정들

listener, servlet 등등 어떤 파일들을 불러올지 요런내용들이 이 xml에 이미 만들어져 있음

 

 

폴더명 대소문자 주의(일치해야됨)

대소문자나 오탈자 하나라도 있으면 전체 프로젝트가 작동을 안함!!!!!

 

/ 요청이 들어오면 매핑을 통해 동작!

 


[ servlet-context.xml ]

/로 시작 => 최상위폴더

mapping = "/resourcese/**"  리소스에 요청이 들어오면 location = "/ resourcese/" ~~ 요기로 보내겠다


 

커피빈 커피콩

bean 하나를 클래스 하나라고 생각하면 됨

prefix => 앞에 붙는거

suffix => 맨 뒤에 붙는거

 

[ MVC패턴 ]  ___ pdf 파일 7p 참고

 

M (Model) =>  dto랑 dao가 여기에 포함 (.java)

V (View) => 보여지는 화면 (.jsp)

C (Controller) => 사용자의 요청이 들어오면 얘가 잡아서 데이터랑 연결 등 흐름을 제어함. (모델과 뷰를 통제)  (.java)

어떤 모델 혹은 어떤 뷰가 필요한지 받아서 작업 후 다시 사용자에게 전달

사용자는 이런 흐름을 모르니까 바로 화면을 보는줄 아는데 

사실 컨트롤러 외에도 중간과정이 많음 (pdf 파일 7p 참고)

요런 많은 작업들(.xml)을 spring이 다 중간에 처리해줌

 

어디에 뭘 만드는지는 확인하고 배우자...

 

** 제일 중요한 코드 **

cpmponent 를 scan 해옴 (읽어옴) 

base-package = " ~~ "   내가 만든 패키지(com.phyho.web)에서 읽어옴 

컨트롤러가 들어있는 위치임

base-package 는 저 패키지의 하위에 속해있는 모든 것들을 읽어오는애

저 패키지 하위에 속해있지 않으면 읽어오지 못함.

 

 

내 패키지(com.phyho.web) 말고

다른 패키지(com.phyho) 안에 class 파일 생성해보자  

클래스명 대소문자 주의

 

일단 @로 controller 선언

*** 주의 IndexController  => BoardController로 이름 바꿈 ****

 

@RequestMapping(value = "/main")

main이라는 요청이 들어오면 해당 jsp 파일을 불러옴.

 

메소드가 여러개 있는걸 클래스라고 불렀는데 서블릿은 이런 클래스 하나의 흐름을 제어했음

흐름 한덩어리를 메소드로 제어 

main요청이 들어오면 아래 main()  메소드가 동작,  즉 (" " 이라는 jsp파일을 열어줌)

/WEB-INF/views/main.jsp

      prefix                    suffix

요렇게 될 예정

 

view - others 에서 jsp 파일(이름은 main으로) 생성해보자

 

 

tomcat으로 실행

 

jul12 하나만 가동 11은 remove로 옆으로 이동시켜줌

 

에러없이 정상구동

main으로 이동해보면

패키지가 다르기 때문!!!!

INFO : com.phyho.web.HomeControlle - Welcome home! The client locale is ko.
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/web/main] in DispatcherServlet with name 'appServlet'


다시 내 패키지로 클래스 파일을 옮겨보자

 

 

 

그럼 이제 두 파일 모두 메모리에 로딩될 수 있음

성공

 


 

 

패키지명 변경하고 다시 파일 옮겨보면 당연히 실행안됨

 

다시 분리 (아래처럼)

 

 

변경한 패키지 명이랑 아래처럼 맞춰주면 (.web 삭제)

 

가동됨

 

하위의 어떤 파일이 만들어질지는 모르지만 하위에 있는 모든것들 선택


다시 원래대로

 

 

폴더에서 파일위치 확인


얘는 내장 브라우저

 

window - web Browser 에서 원하는 브라우저 선택가능 (크롬, 엣지 등등)

런온 서버하면 내가 선택한 브라우저로 새창열림


 

[ web.xml ]

 

오류(404오류) 잡아주는 부분 (/로 받음) 


 

 

JAR 파일

WAR 파일

=> 찾아보기

 

WAR 압축파일

 

version 체계 1.0.0 => 1버전 . 테스트버전(홀수) or 안정화된 버전(짝수)  . 몇변의 패치?

11.0.19 => 11버전, 안정화된 버전, 19번의 패치

 

version, java버전, spring버전 변경함

 

 

 

 

자료파일 추가는 요기 한덩어리 (pdf참고)

 

저장소 추가 설정 (pdf)

properties 와  dependencies  사이에 repositories 적어줌

 

다시 말하지만 요만큼이 하나

 

두번째 repository도 아래처럼 채워주기 

전자정부프레임워크에 만들어져 있는 저장소를 불러와서 쓰기위해

=> 불러오기 위해서 일단 연결까지만 해준거 

저장소가 maven임 (gradle 등등)

 

maven 에 기능이 없으면 maven2(대비책)에서 읽어오고

또 없으면 전자정부에서 읽어오라고 저장소 연결해준 과정임


왜 해야될까... 

한번 연결없이 전자정부 페이징을 했을때 오류가 나는지 확인해보자


다시 연결 살려서 작동시켜보기

위에서 체크부분이 없으면 오류가 난다!

 

생성된 egovframwork에 파일들 불러와진거 확인가능

 

( 요만큼을 외울수는 없지만 일단 이해까지만 하기 )

 

 

<!--  spring jdbc --> 

<!--파일업로드 -->

<!--mariadb-java-client -->           =>  version 3.0.8로 수정해줌 

<!--mybatis -->

<!--mybatis-spring -->

pdf에 있는 코드들 추가

 

하나하나 추가해주면 저 코드에 표시된 위치에 파일생성

 

실행해보면 오류없이 연결성공 확인!!!!

 

 

자바 버전 11로 바꿈

 

 

 

 

[ web.xml ]

프로젝트실행시 보여질 첫페이지설정


톰캣에서도 있는

 

요부분을 적어준거


에러페이지 처리코드를 아래쪽에 적어줌

=> 예를 들어 500에러가 뜨면 /error500 jsp페이지로 이동

근데 우리는 error 경고창을 살펴봐야 하니까 일단은 넣지말기


데이터베이스랑 연결하기 

 

아래쪽에 추가

 

<!-- 주석 데이터베이스랑 연결하기 -->
<beans:import resource=""/>

 

 

다른곳에서 가져온xml을 이곳에 넣겠다

 

<beans:import resource="classpath:/spring/*-context.xml"/>

* 대신 db, file 등등 앞에 뭐가 오던 뒤에는 -context.xml로 끝나는 모든 파일들을 연결하겠다.

 

* classpath : class파일의 경로를 알려줌

 

 

그럼 이제 spring 폴더를 만들자

 

 

 

src/main/resources 에서 spring 폴더만들고

[ db-context.xml ] 생성

 

 

옛날에 했던 DBConnection을 xml로 해볼거

(pdf_6page)

<bean class=" "  id=" " > 요 해당클래스에서 해당 id를 가져오겠다

id인 dataSource라는 이름으로 데이터상에 생성된다는 의미

* 대소문자 오타주의*

 

이전에는 dao에서 sql문 넣었었는데 그걸 분리해서 아래처럼 넣어줄거

그럼 id를 이용해서 계속 재활용 가능

 

 

 

sql 문장들을 모아놓은걸 mapper라고 부름

mapperLocations _ mapper들이 모여있는 장소(Locations)

configLocation _ config는 하나밖에 없어서 Location에 s없음

 

 

<property name="mapperLocations" value="classpath:/mybatis/mappers/*-mapper.xml"/>

앞의 위치에서 ~~~.mapper.xml로 끝나는 파일들을 가져오겠다?

 

 

위의 bean 객체를 아래 bean객체에 넣었으니 

또 아래 bean객체를 넣을 객체를 만들자

src/main/resources 내부에

mybatis 폴더 생성

그 내부에 config, mappers 폴더 생성

 

요기에서 미리 써준 폴더를 이제야 만들어준거

 

 

config 폴더 아래에

[ mybatisConfig.xml ] 파일생성

 

mappers 폴더 아래에도

[ boartd-mapper.xml ] 파일생성

 


 

내꺼는 위 사진처럼 폴더가 아니라 패키지로 보여서 헷갈려


 

 

mybatis – MyBatis 3 | Configuration

 

mybatis – MyBatis 3 | Configuration

Configuration The MyBatis configuration contains settings and properties that have a dramatic effect on how MyBatis behaves. The high level structure of the document is as follows: configuration properties These are externalizable, substitutable properties

mybatis.org

 

위 사이트에서 요부분(기본설정) 가져옴

 

 

[ board-mapper.xml ] 파일에 붙여넣기

요부분도 가져와서

 

 

 

[ mybatisConfig.xml ] 에 붙여넣기

 

 

 

board-mapper.xml 파일에서

    <mapper namespace="boardtest">    </mapper>

boardtest 얘가 실제이름, 자바는 얘를 찾아갈거

부를때는 클래스처럼 boardtest . ~~ 해서 부를예정

(클래스에서 했던 파일이름 . ~~ 가 아니라)

 boardtest .(id명) 

여기에서는 boardtest.boardList 요런식으로

 

 

[ mybatisConfig.xml ] 

 

typeAliases => 별칭, 별명

런온서버 오류 안뜨는지 확인!

db-context에서 classpath 를 calsspath로 써서 500번 오류났었음 ㅠㅠ

 

[ indexController.java ] 

 

위에서는 get방식으로만 받겠다 써줬는데

아래는 위와 다르게 애초에 @get~방식으로 가져오겠다고 축약형태로 써준거

 

가져올건 borad.jsp

 

[ board.jsp ] 파일생성

 

런온서버해서 오류 안뜨는지 확인


데이터 보내는 방법

 

model과 view를 하나로 붙여 => ModelAndView

 

mv.addObject("name", "홍길동");

board.jsp를 열 때 "name"이라는 이름으로 "홍길동"이라는 값을 가져갈거

 

board.jsp 에서 출력해보면

 


 

 * Controller = 흐름제어
 * DTO/VO
 * DAO
 * Service = 프로그램 로직

 

Controller 는 흐름만 가져가고 주요작업은 Service 에서

 

[ BoardService.java ] 클래스생성

이제 Indexcontroller랑 service를 연결해줄거

그런데 일단 이름바꾸고 (Indexcontroller -> BoardController )

 

 

BoardService 에 

@Service 선언해주고 

BoardController 랑 service 랑 연결해주자

 

 

연결방법1

new 객체생성

연결방법2  =>  Autowired

 

 

연결방법1은 요청 들어올때마다  new 방식으로 객체를 만들어야 하니까 

연결방법2처럼 @Autowired 을 사용해서 그냥 하나 만든 객체를 불러와서 계속 사용할거


* Controller = 흐름제어
    = 컨트롤 기능을 하는 인스턴스
   = 사용자의 요청이 들어오면 해당 URL에 맞는 페이지와 데이터를 보내줍니다.
 
* Service = 프로그램 로직

* DTO/VO = 데이터를 담아 보낼 컨테이너
* DAO = 데이터베이스와 연결되어서 작업합니다. => mybatis 


* JSP = 보여주는 화면 (VIEW)
 

(진행 순서)
  사용자 -> 컨트롤러 -> 서비스 -> DAO -> mybatis -> DB
  사용자 <- JSP + DB <- 컨트롤러 <- 서비스 <- DAO <- mybatis <- DB

=> 컨트롤러가 서비스를 호출하고 데이터가 필요하면 DAO에 요청 DAO는 mybatis에게 쿼리문 실행결과 요청

다시 결과 가지고 DAO에 전달 -> 서비스에 전달 -> 컨트롤러에 전달

 

( 연결 )
  1. @Autowired = 스프링에서 제공, 타입이 일치하는 녀석을 연결
  2. @Inject   = 자바에서 제공, 타입이 일치하는 녀석을 연결
  3. @Resource  = 자바에서 제공, 이름이 일치하는 녀석을 연결

 

2번 @Autowired  가 가장 편리 

 

@Autowired
private BoardService boardService;

                 이 타입이 존재한다면 새로운 객체생성 없이 바로 연결


  [ 스프링 기술 ]

  POJO (Plain Old Java Object)
  어렵고 복잡하지 않게 간단하게 코딩하기
 
  1. DI ( Dependency Injection ) 의존 주입
  프레임워크가 객체의 의존성 주입을 담당합니다. == IoC
 
  2. IoC ( Inversion of Control ) 제어역전
  프레임워크가 권한을 가져갑니다.
  자바가 객체를 생성하고 서로 연결하고 사용하는데
  이러한 기술을 IoC컨테이너가 관리 서비스 해줍니다.
  IoC컨테이너는 객체의 생성/초기화/서비스/소멸 --> (라이프사이클)
  라이프 사이클을 관리합니다.
 
  3. AOP ( Aspect Oriented Programming ) 관점지향 프로그래밍
  객체지향과 다른 개념. 각 객체마다 중복되는 작업들이 있다면
  해당 중복 작업을 기준으로 동일 행동을 하게 만드는 것.
  메서드가 실행되기전, 실행된 직후, 실행시점에 따라 따로 기능을 적용 시키는 것

 

1, 2, 3에서 가지고 있는 특정 작업이 중복된다면

따로 AOP(파랑)으로 빼줘서

각 번호의 특정작업을 시키려고 한다면 AOP에게 시킴

=> 관점지향 프로그래밍

 

2. IoC(Inversion of Control) 제어역전

=> 자바가 해야하는 역할을 spring 프레임워크가 다 가져가버림 (객체생성, 연결하는 역할)

 

권한을 가져갔으니 주입도 내가 하겠다

1. DI(Dependency Injection) 의존 주입

 


package com.phyho.web; 아래에

[ BoardDAO.java ] 클래스 생성

 

 

 

@Controller == Controller
@Service == Service
@Repository == DAO

 

DAO는 DAO가 아니라 Repository 로 선언한다! 반전!

 

여기에서 sqlSession 은 이전에 만들어줬던 아래 캡쳐의 객체를 가져온거!!!!

 

서비스와 DAO 연결

 

이렇게 DAO와 연결된 서비스는 아래의 컨트롤러와 연결되는거! 

 


 

[ 깃헙에 올리기 ]

 

깃헙에서 jul12 이름으로 repository 생성해주고

오늘자 프로젝트 jul12 마우스 우클릭 - team - shareProject 

repository 를 깃헙으로 지정

repository master 라고 뜨면 됨

 

다시 jul12 마우스 우클릭 - team - commit

 

 

1. Push HEAD 클릭

2. 오늘날짜꺼 선택

3. 깃헙에서 복사한 URL 입력

4. master 입력 -> user & password 불러와짐

 

깃헙에 업로드 완료!!!