JSP

jsp는 url 요청을 할 수 있다 (file을 요청할 수 있다는 것 index.jsp // a.png 등)

즉 톰캣을 안 탈 수도 있다는 것이다 (아파치만을 이용해서 정적파일만 받을 수도 있다는 것)

 

Spring

톰캣은 WEB-INF 밑에 접근이 불가능하다

이렇게 만들어야 URL요청이 불가능해진다 (URI로 Controller만을 이용해서 접근하도록함, 외부로부터 안전)

JSP파일을 WEB-INF에 넣자

이렇게 만들면 톰캣을 안 탈 수가 없다(컨트롤러를 타야하기 때문)

 

//templates 폴더 - 머스태치 타임리프 등

 

 

톰캣

톰캣이 실행되면 열리는 것

1 카타리나

2 web.xml -> 배포서술자 / 웹서버의 가이드 역할 / 필터
-- 바디에 넣을 문자형식 UTF-8 - 모든 인코딩을 UTF-8 로 만들기
-- 웰컴파일리스트 
-- DB Resource 
-- 커스텀 필터 등록가능(아이피 차단 등 // lucy)
-- 서블릿 매핑 -> 자바파일이 아니더라도, 이 파일에서 매핑해줄 수 있다,
( /* -> FrontConroller.java 만 주고 컨트롤러에서 라우팅하게 하자)
JSP에서는 쿼리문으로 분기를 하였는데
스프링에서는 URL파라미터를 분기해 줄 수 있다

(spring에서는 yml파일에 적어놓으면 web.xml에 자동적으로 등록이 된다)

3

 

 

-------------------

sqlsession은 DBCP, MyBatis 과 연계되어 있다

datasource DBCP - 데이터베이스 커넥션 풀링 기술
MyBatis - rs 결과를 오브젝트나 컬렉션으로 들고 있는다 - persistence - 데이터베이스에 접근해서 데이터를 오브젝트화

DB - sqlsession - repository

 

----------------

서블릿 매핑

localhost:8000/post1?cmd=test

post/1 -> url 파라미터

? -> 쿼리문

---------------

dispatcherServlet

서블릿 매핑, 프론트컨트롤러, 라우팅 등을 관리하는 객체

request요청만 추적한다

----------------

@Controller는 사용자가 요청시에 뜬다

dispatherServlet은 요청이 오면

@Controller

@RestController

를 검색하여 메모리에 띄워서 실행시킨다

-------------------

다른 어노테이션은 서버 실행시에 미리 다 뜨는데

@Controller는 위와 같이 다르다

자바는 쓰레드를 많이 생성 할 수 있기 때문에

사용자가 동시에 요청할 경우, 즉 request할 때마다 띄우게 된다

---------------

레거시에서는 

루트컨텍스트/ 서블릿 컨텍스트 가 있어서

메모리에 뜨는 타이밍에 따라 관리한다

-------------

 

@Transactional

알아서 롤백 알아서 커밋됨

 

-------------

퍼시스턴스 - DB와 동기화 되어 있는 데이터 (DB에서 받은 데이터, DB내용과 똑같아야함)

--------------

 

경고메시지

info warn error 등이 있는데

warn error 등을 확인

----------

mysql은 루트로 들어가서 사용자 선택

--------------

 

 

스프링 부트 세팅

Spring Web

SpringBoot Devtool

Lombok

MySQL

MYbatis

---------

JSTL

Tomcat-Embed-Jasper

-----------

테이블생성

------------

1 properties
yml 확장자 변경
DB연결정보넣기
JSP view 경로 설정 (ViewResolver)

2 config 폴더생성
(복붙)
DataSourceConfig.java(참고 : yml 설정을 참고)
DataAccessConfig.java(참고 : DataSource와 Mapper)

3 Mapper 경로에 UserMapper.xml 생성 및 파일 세팅

4 User 클래스 만들기

5 UserRepository 만들기

6 jsp테스트 파일 만들기

7 TestController 생성 및 테스트

 

 

이름과 패키지명을 설정해준다

 

 

필요한 디펜던시를 고른다

 

 

외부에서 필요한 디펜던시들을 가져온다

 

 

 

 

 

 

 

 

외부 디펜던시들을 pom.xml에 넣는다

 

 

application.yml

server:
  port: 8000
  servlet:
    context-path: /blog

spring:  
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
      
  datasource:
    url: jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
    username: spring
    password: bitc5600
    driver-class-name: com.mysql.cj.jdbc.Driver

properties파일을 yml로 바꾸고 세팅해준다

 

 

컨피그 파일을 만든다

 

 

 

 

DataAccessConfig.java

package com.cos.demo.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = "com.cos.blog.repository") // 옆의 경로 이하 파일을 메모리에 다띄워준다(@repo~~ 안해줘도됨)
public class DataAccessConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(
        		new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
}

 

 

DataSourceConfig.java

package com.cos.demo.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataSourceConfig {

	@ConfigurationProperties(prefix="spring.datasource")
	public DataSource dataSource(){
    	return DataSourceBuilder.create().build();
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---------------------

 

서비스 연습

 

 

 

 

 

https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

 

MyBatis – 마이바티스 3 | 매퍼 XML 파일

Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면 ��

mybatis.org

xml 파일 세팅 방법

 

 

 

 

 

 

 

 

(매개변수를 DTO로 바꾸자)

 

 

DTO생성

 

 

 

 

 

 

 

 

 

 

 

 

----------------------

 

// ViewResolver -> @ResponseBody이 있다면 문자열을 전송한다 / @ResponseBody이 없다면 파일명을 찾아서 전송한다

 

 

 

 

 

jsp 같은 것을 템플릿 엔진이라고 한다

부트진영에서 jsp를 버렸음 (하지만 아직까지 회사에서 jsp를 사용한다)

최근에 가장 핫한 것은 Mustache

 

 

 

 

 

 

 

 

여기에 템플릿 엔진 파일을 넣으면 부트가 자동으로 찾는다

 

서픽스 프리픽스
확장자 적으면 안된다
뷰리졸버가 찾는 주소

 

이클립스에서는 기본적으로 mustache를 지원하지 않는다

 

 

 

html로 만들어보자

 

 

 

 

html로 만들었기 때문에 자동완성이 된다

 

 

 

타임리프- 태그에 모든 문법을 넣어서 처리 (th:text=${object.value})

타임리프 그루비 등은 문법이 많아서 템플레이트에서 코딩하게 된다
(너무 많은 것을 지원해주기 때문에 자연스레 그렇게 된다)
그렇게 되면 협업시 불편해진다
템플레이트는 뿌리는 용도로만 사용하는 것이 서로 편하다

 

 

mustache는 문법이 적어서 뿌리는 용도로만 쓸 수 있다 (배우기도 쉬움)

 

 

 

 

 

 

DI  autowired 를 편하게 하는 방법이 파라미터에 적는 것이다

 

 

 

 

 

 

 

 

 

 

 

-----------

 

 

----------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

헤더 푸터 추가하기

 

 

 

 

 

 

 

 

 

 

------------------

 

적어놓기만 하면 자동으로 설정됨

스프링에서는 권장하나

쓰기에 좋기 않기 때문에

yml파일로 바꾼다 (JSON이 변형된 것이라고 생각하면 됨, 중괄호와 쌍따옴표 뺌)

properties파일과 똑같은데 가독성이 좋다

server: 

 

무조건 자동완성

 

 

탭을 쓰면 안된다

 

 

 

 

아마존에 배포할 때 포트는 80포트 jar파일로 패키징

 

 

 

 

 

스프링레거시에서는 jsp파일에 접근하는 것을 원천봉쇄하기 위해 web-inf 폴더에 넣는다
(mvc 모델1은 사용하지 못한다는 뜻)
(컨트롤러 통해서 가는 것이 mvc 모델2)

 

스프링 부트는 jsp를 지원하지 않고 web-inf를 사용하지 않는다 (templates를 사용)
그래서 yml파일에서 프리픽스 서픽스를 설정

 

 

 

무조건 embed 써야함

 

 

 

 

디폴트 경로 - src/main/webapp/(프리픽스)/return명(서픽스)

 

 

 

 

이제 jsp를 만들 수 있다

 

 

 

 

--------------------

안되면

서버끄고
project- clean
maven - update project
서버다시켜기

------------------------

 

 

 

버퍼로 쿼리문을 날리기 위함

 

 

1. xml로 데이터베이스연결

2.yml로 데이터베이스연결

3.자바파일로 데이터베이스 연결

3개다 가능하다

 

pom.xml 에 추가하는 방식

 

 

자바에서 dataSource 객체 -> 데이터 풀링 기법

 

 

https://khj93.tistory.com/entry/MyBatis-MyBatis%EB%9E%80-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

 

[MyBatis] MyBatis란? 개념 및 데이터구조

MyBatis란? 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 S

khj93.tistory.com

 

 

미리 프로젝트 생성시 적용해도 된다

 

 

starter 는 스프링부트라고 생각하면 된다

 

 

다른 것들과 다르게 버전을 넣어야 한다

 

 

사용하는 이유

퍼시스턴스 (자바 오브젝트로 매핑)

Select 해서 받아오는 데이터를 rs를 자바오브젝트로 쉽게 변환

 

 

 

 

문서 확인

https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

 

mybatis-spring-boot-autoconfigure – Introduction

Introduction What is MyBatis-Spring-Boot-Starter? The MyBatis-Spring-Boot-Starter help you build quickly MyBatis applications on top of the Spring Boot. By using this module you will achieve: Build standalone applications Reduce the boilerplate to almost z

mybatis.org

 

 

 autowired를 사용하지않고 매개변수에 넣으면

스프링부트가 자동으로 해당 객체를 찾아서 띄운다 (없으면 오류)

 

 

https://github.com/codingspecialist/Springboot-MyBatis-Blog-V3/tree/master/src/main/java/com/cos/blog/config

 

codingspecialist/Springboot-MyBatis-Blog-V3

Contribute to codingspecialist/Springboot-MyBatis-Blog-V3 development by creating an account on GitHub.

github.com

 

 

 

 

Member 객체로 자동으로 담아주는 역할

 

 

인터페이스로 만들기

 

 

 

 

datasource가 동시접속시 순차적 처리를 한다

메모리에 띄울때 @Bean이라는 어노테이션이 있으면 리턴값을 IOC로 등록해준다
(스프링 컨텍스트에 싱글톤 패턴으로 담아간다)

 

*.xml 이라고 쓴 이유는 여러테이블(객체)가 있을 수 있기 때문

 

 

 

 

 

https://github.com/codingspecialist/Springboot-MyBatis-Blog-V3

 

codingspecialist/Springboot-MyBatis-Blog-V3

Contribute to codingspecialist/Springboot-MyBatis-Blog-V3 development by creating an account on GitHub.

github.com

 

 

create user 'spring'@'%' identified by 'bitc5600';
GRANT ALL PRIVILEGES ON *.* TO 'spring'@'%';
create database spring;
use spring;
CREATE TABLE user(
	id int auto_increment primary key,
    username varchar(100) unique not null,
    password varchar(100) not null,
    email varchar(100),
    profile varchar(200),
    createDate timestamp
) engine=InnoDB default charset=utf8;
CREATE TABLE post(
	id int auto_increment primary key,
    title varchar(100) not null,
    content longtext,
    userId int,
    createDate timestamp,
    foreign key (userId) references user (id) on delete set null
) engine=InnoDB default charset=utf8;
CREATE TABLE comment(
	id int auto_increment primary key,
    userId int,
    postId int,
    content varchar(300) not null,
    createDate timestamp,
    foreign key (userId) references user (id) on delete set null,
    foreign key (postId) references post (id) on delete cascade
) engine=InnoDB default charset=utf8;

 

 

설정을 자바파일로 만들어져야한다 
스프링부트에서는 yml에서 설정해놓으면 자동적으로 자바코드로 변환된다

 

                         <-object                  <-rs

Controller - reopsitory - SQLSession                   - DataSource - DB(MySQL)
                                SQLSessionFactory가 SQLSession을 만든다
                                DataSource+매퍼파일등록(repository라는 클래스와 연결되어 있음)

SQLSession은 CRUD 함수를 가지고 있다

SQLSession은 데이터베이스에 연결 할 수 있는 유일한 객체

 

 

 

 

CREATE TABLE member(
	id int auto_increment primary key,
    username varchar(100) not null,
    phone longtext
) engine=InnoDB default charset=utf8;

 

 

 

 

 

 

----

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. 스프링 부트 + MyBatis(쿼리 매핑) + MySQL

 

2. 스프링 레거시  + MyBatis+ MySQL 
CRUD

 

3. 스프링 부트 + JPA + MySQL
(가장 최신트렌드)

-------------------

 

그래들, 메이븐 - 라이브러리 관리 도구, 버전 관리 도구, 의존성 관리 도구

자바코드와 라이브러리를 패킹 할 수 있다

- 주의점 : 많은 의존 라이브러리를 받게되면 파일이 깨지거나 문제가 발생 할 수 있다. -> 다시 다운로드

------------

 

 

 

----------------------

Spring Boot DevTools -> 저장만하면 리로딩 해줌

 

원하는 SQL체크

 

 

 

템플릿이란 JSP같은 것인데 스프링에서는 JSP를 버리는 것을 권장 (우리는 JSP로 작업)

 

 

 

디펜던시를 지우고 저장하면 

 

자동으로 삭제 및 추가를 한다

 

해당 코드를 pom.xml 에 넣으면 메이븐이 알아서 의존 라이브러리들도 설치해준다

 

 

메이븐이 관리하는 라이브러리 저장소

 

예를들어 롬복 라이브러리라면 위와 같은 경로

 

메이븐에서 다운받을때 잘못된 경우 해결법

1. 위 폴더를 삭제하고 다시 프로젝트를 다시 실행하면 된다

또는 못받은 라이브러리만 삭제하고 다시 실행

 

 

2. 프로젝트를  업데이트한다

 

 

JSP 프로젝트에서는 서블릿을 만들었는데 여기서는 자바파일로 만든뒤 어노테이션을 추가한다

 

컨트롤러 어노테이션

 

대표적 어노테이션

@Controller

@Service

@Repository

@Config

@Component - 특별한 목적이 없는 녀석들

프로젝트 시작시 이러한 어노테이션이 적혀있다면 메모리에 띄운다

 

 

 

 

 

--------------

 

다른 패키지에 만든 컴포넌트는 뜨지 않는다

com.cos.demo 이하만 스캔

등록

다른 패키지에 만든 건 메모리에 뜨지 않는다

-----------------

외부로 노출 되는 것은 컨트롤러 밖에 없다

@Controller 

 

@Component 등은 노출되지 않는다

-------------------

제어의 역전

Inversion of Controll

IoC - 어노테이션 한 클래스를 메모리에 등록

--------------

DI - Dependency Injection 의존성 주입

 

핵심!!!

타입을 통해서 주입받는다. 타입을 잘 적어야함

--------------

다른 패키지에 만든 컴포넌트는 불러와지 않는다

 

 

------------------

스프링 레거시에서는 컴포넌트 스캔을 servlet-context.xml 파일에 등록해줘야 한다

--------------------

 

 

--------------------

컨트롤러 함수이름은 크게 중요하지 않다

--------------------

 

new를 하기 위해서는 @Component를 사용하지 말아야 한다

------------------------

 

 

data로 보내도 객체 내부의 변수명에 맟춰서 자동으로 입력된다

-----------------

 

접속 주소가 같아도 받는 방식을 다르게 할 수 있다

 

postman

----------------

 

 

 

-----------------

 

함수 널처리나 전처리(파싱 등)

jsp에서는 if (requset.getparamater("aa") != null){}

스프링에서는

함수에 들어가기전이나 후에 널처리를 할 수 있다 = AOP

 

jackson 바인더 - 제이슨 파싱

아래 조건에서 발동

발동시기 - 함수 시작 직전

 

 

 

보내는 값을 하나 빼도 알아서 있는 값만 파싱해준다

-------------------

 

post데이터는 기본적으로 key : value 형식

객체에 담기 위해서는 setter가 필요하다

--------------------

 

MessageConverter 스프링으로 오는 데이터를 컨버팅해준다

기본은 form데이터 , @RequestBody 를 사용하면 json데이터 컨버팅 가능

------------------

 

 

--------------------

 

스프링 할 때는 통신시 JSON으로 통일 하는 것이 좋다

------------------

 

스트링 타입으로 전송하고 싶다면

 

-----------------

 

@RestController

컨트롤러를 타는 모든 주소가 리턴해주는게 모두 데이터일 경우 사용

-----------------

 

 

+ Recent posts