컨트롤러 :

서비스(업무로직)

다오(데이터)

데이터베이스

뷰(JSP)

 

DI작업

트랜잭션 

 

JDBC에다가 추가적으로 마이바티스라는 매퍼작업

백엔드기술로서 이런작업을 처리할때 추가적인라이브러리 : 스프링, mvc라이브러리,

트렌트가 바뀐다.

JSP대신 -> 타임리프

스프링을 이용하다보니 조금더 새로운방식, 새로운표기법

타임리프가 JSP대신해서 많이쓰인다.

 

서버사이드자바 템플릿엔진

웹뿐만 아니라 다른문서를 만드는곳에서도 쓰일 수 있다. 

주된목표는 지금까지 사용ㅎ왔단 템플릿에 영향을 주지않으면서 서버코드를 꽂아넣을수있다.

jsp는 퍼블리셔서 만들어놓은 페이지를 바꿔가면서 데이터를꽂는다. (타이틀을없애도 el태그)

반복할떄도 기존것삭제후 ->코드블럭

서로 협업할떄 영향을준다.

퍼블리셔서 완벽하게 작성후전달해야한다.

 

기존것을 그대로 나둔다. 꽂을텍스트에대해서 추가한다

타임리프의 장점은 6가지 종류의 템플릿을 만드는데 가능하다 (다른 템플릿엔진도 다 가능...ㅎ)

 

타임리프설정하기

 

1. dependency 중 secutiry, security-test주석처리
2. spring->starters에서 타임리프라이브러리추가
3. websecutiryconfig 어노테이션 지우기

 

css,html은 static

서버단은 웹앱

 

templates 에 index.html추가

 

1.타일즈 리졸버 (우선순위높음) src를 먼저찾음 -> 인덱스를 찾는다. "index"

2.리소스 리졸버

3. 타임리프 리졸버 (aa- >템플릿폴더에서 aa.html을찾는다.

타임리프라이브러리를 설치하면 타임리프를 먼저찾는다.

 

컨트롤러에서 타일즈를뺴고 타임리프만 가져가는게 좋다.

타임리프쓸때 타일즈 걷어내기

혼합해서쓰지말것

타일즈 컨피규레이션 주석처리하기

 


퍼블리셔서 나중에 페이지를 변경해도 서로간에 데이터를 침범하지않는다.

 


text

utext: unescaped text

 

출력되는게 아니라 볼드체로 적용하려면 ?


jsp에서 el태그와 비슷하게생겼다

하지만 분명히 다르다.

암기하기

message : #{} 

메세지 : 외부파일

aa.properties 등 설정.properties로 확장자만 프라퍼티즈

프라퍼티즈컬렉션이 자바에있음

프라퍼티즈 클래스

파일로 저장할 수있다. xml 또는 프라퍼티즈확장자로 

맵컬렉션인데 추가적으로 실제파일과 연관되서 읽을수있다.

 

저장,읽기 가능

외부파일로 저장해보자 원하는 설정을

 

#{}프라퍼티즈확장자인 외부파일에서 불러옴 ->메세지(외부파일) 꺼내오는것

 

컨트롤러에서 모델에서 뽑아올떄는 ${}

#{} 메세지를 불러온다.

${}은 모델에서 가져옴


컨텍스트라는 저장소에 데이터를 담았다가 꺼내쓸수있다.

setVariable로 담았다가 getVariavle로 꺼내쓸수 있다.

OGNL

JSP에서도 ognl을 쓰고있었다.

객체라면 그안에있는것들을 점으로 호출했었다.

 



fragment 이름이 카피인것 집어넣는다

 

 

~ 절대경로

한글깨짐

.

https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#expression-basic-objects

div외에도 가능

insert 

리플레이스 :덮어쓰기, 프래그먼트시정시 대신해서들어가는 것,

인클루드:안쪽으로

 

물결생략가능


비포

id 또는 fragment로 가져온다.

에프터

 


레이아웃처리방법 두가지

 

레이아웃에서 메인을뺴서 리스트에 메인넣기

list.html의 div안쪽이 다 사라지고 layout의 th:fragment="body"로 덮어진다.

왼쪽에있는애들이 모두 오른쪽으로 대체됨.

 


문제점 : 레이아웃에서 헤더,푸터를 가져왔는데, list.html의 메인영역위에 덮어씌워져서 list의 메인이 사라졌다.

레이아웃에세 내 main을 꽂아넣어주고 가져오려면 ?

 

레이아웃을 가져오는데,

헤더,푸터를 가져왔다. 

메인은 어떻게가져온담 ?

 

list.html에서 헤더,푸터를 레이아웃에서가져온뒤

바디에게 내꺼써서줘라고 할수있다

 

레이아웃의 내 바디의정볼르 꽂아넣을수있다

 

list의 자기영역에서 main클래스로 선택된애를 레이아웃에게준다.(.main)

 

레이아웃의 body(x) x를 자기 몸에 가져다붙인다. 자기영역에 가져다붙인다.

1.list.html의 body(~{this::.main}) 이 레이아웃의 바디부분을 가져오고 , 덮어씌운다

2. list의 메인부분이 레이아웃의 메인때문에 안보이게되므로 인자를 넘겨준다 

.main은 내껄쓰겠다

3. layout.html의 th:fragment ="body(x)" x는 list가 지정한부분을 넣겠다

4. th:replace="${x}" main부분을 x에 넣어줘

 

남의것을가져오면서 내것을 거기에 꽂을수있어

외부라이브러리를 가져올 필요가없다.


타임리프말고, 타일즈같은 라이브러리를 쓰는 방법

 

스프링 MVC

-컨트롤러, 
@Controller
@RestController

-입력, 
@RequestParam, @PathVariable, @Cookie
-출력
@ResponseBody

스프링 DI:Ioc Container/역제어/
@Component->@Service,@Repository,@Controller,@Configuration,@Bean
@Autowired

마이바티스(SQL 매퍼를 이용해서 JDBC를 대신 작성해주는 프레임워크)
@Mapper->@Select,@Insert,@...
XML ->resultType,resultMap,Dynamic Query <if><foreach>...

JUnit을 이용해서 테스트
Log 를 통해서 쿼리를 보는 방법

MVC구현과 3Tier(티어)[UI<->Service<->DAO]에서 필요로하는 기본적인 솔루션 2가지
-계층간의 사용방식
-UI에서 중첩되는 데이터 사용방식

스프링 트랜잭션
@Transactional


 

데이터베이스를 사용하기위해 다오

orm 나중에설명

셀렉트할떄 (값을가져올떄), 업데이트할때 고민되는 부분이있다

 

select * from notice where id = 3 (or id=5 or 9)

가끔은 이 쿼리문을 3이 아니라 3또는 5 또는 9 여러개를 담는 경우가 있다.

select * from notice where id in(3,5,9...)

1. 10번의 쿼리를 실행하고 10번위 데이터를불러와야한다.

또는 다오에게 아이디를 통째로주는것

 

다오 :sql대신, 필터링, 집계,정렬,배열선택

마이바티스는 해당시퀄이가능하도록 기능제공

 

아이디즈에서 하나꺼내서 item에 담는다.

(시작  )끝남

id출력

구분자seperator =","로 반복

 

colletion에는 배열이나 리스트만 온다

아이디를 배열에 전달
콘트롤러 / 마이바티스다오
매퍼 / 콘솔

foreach : 전달하는 ids를받아서 id하나를 꺼낸다. 쉼표를이용해 아이디를 반복하게해준다.

1
2
3
4
5
6
7
8
9
    <select id="getListIn" resultType="com.newlecture.web.entity.Notice">
        SELECT *
        FROM Notice
        WHERE ID in
        <foreach item="id" index="index" collection="ids"
         open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>
cs

 

단위테스트 

junit 테스트툴

juit은 스프링이 아니다.

마이바티스는 스프링이랑 상관없다..

 

스프링은 BootPrjApplication클래스 실행 -> SpringApplication.run() 실행 -> 스프링깨어남 ->마이바티스 깨어남

스프링이 일어나야 컨테이너에 객체가 찬다.

스프링이 일어나야 마이바티스를 꺠운다.

 

테스트하고저ㅏ하는 클래스 선택- 마우스오른쪽 - 테스트유닛

스프링을 깨우지않은상태

test가 메인함수가 아니니까

실행자가 junit () 

@Test를 통해 실행해준다.

 

1.메인함수로 반환값확인

2.트레이스작업

 

런에즈- 제이유닛으로 실행

코드 : 이클립스가도와줌,

 

메크로함수테스트해보기


스프링이일어나야 객체들이찬다

 

마이바티스에 제이유닛플러그인을 ..

라이브러리추가

pom.xml에 추가

마이바티스가 이미 개발목적

테스트할떄사용하면 ,,,

http://mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/index.html

 

 


사용자가 액션하면 ..

사용자행위가 그대로묻어난다

likeToggle

 

부품의부품화...잘못!

서비스가 서비스를 부품으로 xx -> 인터페이스라서 ?

/ 아마 오른쪽으로가게될것..(병목발생) ->고립화필요

남이만든 서비스를 쓰면 민폐를 끼칠수있다...협업에따라다름


대댓글기능

포이치안에 포이치

 


와스같은컨테이너가있다

엔터프라이즈자바빈

 

서비스에서 직접jdbc가편할수도있다..

AOP

어노테이션이 aop로 구현되어있다.

 

관점지향 프로그래밍

 

업무가 말했던것만 코드로 만들지않는다.

내가 만드는 내용중에는 업무로 분석된것이 아니라,

ex 성능에 문제가있다면 , 실행시간이 느린 함수체크를위해 로그기록, 시간을 재기위한 코드를 포함시키게된다.

관리자가 할일, 사용자가 할일 (조건처리필요)

 

프로그래밍은 업무외에 다른사람입장(새로운관점)이 필요하다.

개발자,운영자 목적

 

코드마다 똑같은내용발생.

노가다작업발생

->방법론나옴 AOP

 

업무자 + 다른관점 : 위아래에 꽂는다. 뺄수도있다

 

AOP관련용어

업무자/클라이언트/사용자 : 주업무, core concern , primary concern

부업무 :  cross cutting 방향성

 

크로스컷팅을 쉽게하기위한 방법론

 

객체지향안에 사용되는 함수안에서 쉽게 꽂고뺄수있는 방법론

 

한번만큼 코드를 직접하지않고 모든함수에 꽂아 줄 수 있니 ?

빵또아->아이스크림고 ㅏ빵 분리-> 위에있는 빵 실행 -> 안에실행 -> 밑에있는빵실행

 

Proxy준비 

 

메소드가 빵을 통해 core concern을 호출,사용

 

과거방식

AOP구현방식

 

오른쪽업무에는 proxy부분을 제외(분리)

proxy / 업무

 

가짜인스턴스생성.

거쳐서호출하기위한 핸들러

 

가짜의토탈(가짜의토탈 호출) 로드할때 이그젬인터페이스를통해 호출

 

aop는 방법론 : 업무로직+로그,권한,다양한 역할자관점을 코드에 넣다빼는방법

프락시로 객체를 호출

프렘워크마다 사용방법이다르므로 개념을알고있으면 사용시 ㄷ움말참저

 

트랜잭션도 이런 프락시를 제공하면서 사용


트랜잭션 특징

 

  • 원자성 (Atomicity)
  • 일관성 (Consistency) :데이터결함이 발생하지않게
  • 고립성 (Isolation)
  • 지속성 (Durability) : 커밋한 내용은 계속 저장되어야한다

억지로 두번의 업데이트를실행했었다

다완전히 ㅅ ㅣㄹ행되길원했었다

결과는 0이되어야했다

중간에오류가났는데 100이다.

 

 

 

 

@Transactional

오류가나면 위에 성공한것이 복구된다

원자성지켜짐

오류는 나지만, 데이터 hit가 처음값1으로 나온다

100이 적용된 후 0으로 덮어씌워져야하는데, 아이디오류로 아예 롤백되어 100, 0모두 적용이안되고

조회하면 원래값인 1이 조회된다.


트랜잭션 : 애ㅔ러나면 원래상태로복구됨

하위부분 호출에대한 트랜잭션 

  • PK − Primary Key
  • NN − NOT NULL
  • BIN − Binary
  • UN − Unsigned
  • UQ − Unique
  • ZF − Zero Filled
  • G − Generate Column
  • AI − Auto Increment

ioc컨테이너에 담긴 객체는 autowired를 통해 불러온다.

@Repository ioc에 담아줘

@Autowired ioc에서 관련 객체 꺼내줘

 

맵핑방식을 xml로 바꾸자~

@Mapper대신 xml구현체를 직접 만들어보자

 

1. https://mybatis.org/mybatis-3/configuration.html#mappers

  NoticeDaoMapper.xml에 매퍼태그를 넣는다.

2. NoticeDao에는 인터페이스이므로 구현할 함수목록만 남긴다.

3. MybatisNoticeDao 생성 (클래스생성시 add눌러서 NoticeDao 인터페이스선택)

현재쓰고있는 마이바티스버전 / resultType = 반환할때의 그릇형식, 반환하게될 객체의 그릇(select의 컬럼)

마이바티스를 스프링에서 사용할때 필요한설정을 갖고있는 라이브러리가 추가되어있다.(자동) 3.5.

 

'%${query}%' 를 쓴이유 ?

#을 쓰면 't'가 들어간다. (값형태)

$는 날것그대로


마이바티스는 동일이름 메소드 중복불가


 

주황:스프링

@controller, @servicem @repository를  ioc에 담는다

@mapper 객체가 바로 ioc에 담긴다

 

그린:마이바티스

마이바티스는 mapper Container를 가지고있다. Mapper객체가 담겨진다.

두 종류로 설정할 수있다.

1. 어노테이션 @Mapper (매퍼객체를 바로씀), 마이바티스에 특화된 인터페이스(제약이생김) , ioc에서 바로 사용가능

2. xml ??Mapper.xml (매퍼컨테이너에 담기만) , 간접적으로쓴다, 자기컨테이너에담는다.Dao는 내가 직접구현할게

두개다 매퍼객체가 매처컨테이너에 담긴다

ioc컨테이너가 매퍼객체를 사용 할 수있게 넣어준다

다오를 구현할때 쓰기위해 객체를 꺼낸다. (MybatisNoticeDao)

 

매퍼개체를 꺼내오는 도구 : sqlSession클래스사용 ( private SqlSession sqlSession)

getMapper()매퍼객체를 가져와

 

마이바티스가 Mapper.xml을 읽으면 Mapper Container 에 Mapper객체를 넣는다.

우리는 그 컨테이너에 있는것을 꺼내서(getMapper) 실제 마이바티스를 구현할때 쓴다. (class MybatisNoticeDao)

무슨 장점 ?

구현체에 대한 내용이 노출되지않는다.

인터페이스는 유지.

쉽게 바꿀수있다. 

독립적인 인터페이스

다오를 직접구현하는게 불편해보여도 정상적인 방법

인터페이스에 @select등 붙이지 않는게 바람직

Jdbc 코드를 2줄코드로 완성

NoticeDao mapper = sqlSession.getMapper(??;

return mapper.getList();

 

모든Mapper의 위치 지정(내가 만든 메퍼정보를 마이바티스에게 알린다) (xml위치지정)

 


getList 인자값이 각각 다른경우 (인자가없거나 하나일떄)

기본값을 넣어준다.

다른데로 sendredirection

마이바티스는 xml의 한줄맵핑으로 ~~

 


디테일페이지

id가 널인 가능성이없으므로 integer말고 int로하기


삭제페이지

update,insert,delete는 반환타입을 주로 int쓴다.

1. 컨트롤러
1
2
3
4
5
6
7
8
9
10
11
12
13
 
@Controller("adminNoticeController")
@RequestMapping("/admin/notice/")//공통분모
public class NoticeController {
 
 @RequestMapping("del")
    public String del(int id) {
 
     service.delete(id);
 
    return"redirect:list";
   }
}
cs

2. 다오매퍼

1
2
3
4
NoticeDaoMapper
<delete id="delete" parameterType="int">
  delete from Notice where id=#{id}
</delete>
cs

3. 서비스인터페이스

1
2
3
public interface NoticeService {
int delete(int id);
}
cs

4. 서비스인터페이스 구현

1
2
3
4
5
6
7
@Service//component
   public class NoticeServiceimp implements NoticeService {
   @Override
   public int delete(int id) {
   return dao.delete(id);
  }
}
cs

5.다오인터페이스

1
2
3
4
public interface NoticeDao {
 
     int delete(int id);
}
cs

6. 다오인터페이스 구현

1
2
3
4
5
6
7
8
9
@Repository//ioc에 MybatisNoticeDao를 담아줘
public class MybatisNoticeDao implements NoticeDao {
 
  @Override
  public int delete(int id) {
 
  return mapper.delete(id);
  }
}
cs

 


 

resultType SELECT문 실행 결과를 담을 객체
parameterType 이 속성에 지정한 객체의 프로퍼티값이 SQL문의 입력 파라미터에 지정된다.(insert,update,delete)

다오 -> 서비스->컨트롤러 순으로 만들어보자

업데이트

1. 다오 인터페이스

1
2
3
4
5
public interface NoticeDao {
    int update(Notice notice);
 
}
 
cs

2. 다오매퍼

1
2
3
4
5
6
7
8
9
10
11
12
    <update id="update" parameterType="com.newlecture.web.entity.Notice">
        update Notice
        SET
        title = #{title},
        writerId = #{writerId},
        content = #{content},
        hit = #{hit: 0},
        files = #{files},
        pub = #{pub}
        where id=#{id}
 
    </update>
cs

3. 마이바티스다오 (다오인터페이스 구현)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Repository//ioc에 MybatisNoticeDao를 담아줘
public class MybatisNoticeDao implements NoticeDao {
    
    //@Autowired//ioc에있는 연관객체를 가져와//mybatis-spring라이브러리:스프링에담아주는역할
    private SqlSession sqlSession;    
    private NoticeDao mapper;
    
    @Autowired
    public MybatisNoticeDao(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
        mapper = sqlSession.getMapper(NoticeDao.class);
    }
 
    @Override
    public int update(Notice notice) {
 
        return mapper.update(notice);
    }
 
}
 
cs

 

ㅇ인서트,업데이트는 인자쓸수잇다

셀렉트는 파라미터타입지정할 수없다.

약속되어있는 param1, param2를 쓴다

 

프로젝트진행 : 디비사용되어야한다 ->데이터베이스구축되어야한다..

https://elfinlas.github.io/2018/02/18/spring-parameter/

https://logical-code.tistory.com/25


11111

컨트롤 + 마우스휠 위로 : 확대

컨트롤 + 엔터

먼저 newlect선택하고 실행해줘야한다


Mybatis 라이브러리 추가

쿼리만들고 구하려는것의 반환타입만 적으면 mybatis가 도와준다


스프링의 역할은 ?

디펜던시인젝션역할

두개의 객체를 결합해준다.

 

 

B가 C를 이용, A가 C를 이용

제품과 부품

제품이 될 수도 부품이될 수도있다.

디펜던시 : 내가 만드는게 디펜던시가될수있다.

 

DI의 장점 : 기능에 대한 인터페이스가 올바르면 , 구현된 다른제품을 꽂아쓸 수있다. 

                협업용이, 다른이유로 버전업을 시켜야하거나 , 구현성능이 좋아진것으로 바꿔낄때 유용

              재사용, 부품교환이 자유롭다

 

1. A는 부품으로쓰임 / 세번째 Frame클래스가 DI 3. 스프링이 코드재배포(재작성) 개선을 위해 설정바꿔준다. 결합관계를 표시만해주면된다

 

"내가 frame하나 객체화했는데 그 이름을 f로 해줘"

"A라는 클래스도 객체화했는데 그 이름을 a로해줘"

"그 a를 Frame의 set함수에다가 넣어줘" (인젝션)"

디펜던시 설정, 디펜던시결합해줌

설정만 바꾸면 알아서 자바코드가 변경되는 식

 

내가 만든건 @Component

남이 만든 클래스는 @Component , @bean

 

기존컨테이너는 각각 써야했는데

ioc컨테이너는 결합 및 각각 쓸 수있다

위 : 일체형 A -> B- >C-> D

아래 : 결합형 D부터만들어짐 , 역순으로 객체를 생성, 부품이 결합

 


반환타입에 맞게끔 NoticeDao를 구현해서 장바구니에 담는다 

 

플랫폼을 공부목적으로..?xxx


Mybatis 역할 :

NoticeDao(@mapper)의 List<Notice>를 구현한다 . Ioc컨테이너에 담아준다. 우리는 꺼내쓰는 작업만 하면된다

 

XML 과 어노테이션

 

새로운버전때문에 설정을 바꾸면 , 

스프링에서는 

어노테이션 : 명찰역할 (훨씬 편리)

xml : 변경발생시 매번설정바꿔야함 (매번 장부작성과 비슷)

 

Responsebody : 뷰페이지를 찾는게 아니라 list()리턴값이 뷰다 ->바로 출력된다.

1.생성자 인젝션 : 가져오자마자 다른 초기화 로직이 동작하게 할 수있다. 세팅될때 더불어서 하게할수있다.

  셋팅이 나중에 바뀌면안된다면 생성자가 적합

2.세터 인젝션 : 언제든지 또 호출될 수있다.  

콘트롤러/서비스에게반환/구현체

IoC에 실린 객체들
noticeDao

noticeServiceimp

noticeController

마이바티스가 sql문을 맵핑해준다.

우리가 직접구현한다면 Jdbc 를 구현했을것..

마이바티스가 이것을 자동으로 구현해준다.

 

IoC container는 스프링에서 자유롭게 객체를 넣거나 꺼내쓸수있는 
스프링 공용 객체보관 container다

@Service

Spring에서 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는 

또한 가독성에서도 해당 애노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있다.

 

@Autowired

생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.

 

@Component 

컴포넌트 스캔 원리 @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.

@Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.

@Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.

 @Controller @Service @Repository 회원 서비스 스프링 빈 등

 

Model and View 


detail페이지


반복패턴을 * 로 쓸수있다.

*에 detail이 들어가면 

detail()의 setVieName과 tiles과 맵핑된다.

attribute는 *위치에 오는것은 {1}로  쓴다.


reg 페이지 tiles와 연결하기

tiles.xml은 자동으로 맵핑되니까 jsp랑 콘트롤러만 수정하면된다

-reg.jsp에서 main만 빼고(바디부분) 다 지우기

-NoticeController.java reg()메소드추가 , 리턴값에 tiles연결

 

 



순서를 따져야한다.

특화된건 위에 써준다.

3

반복을 줄이려면 ?


detail의 제목을 바꾸려면 ?

레이아웃의 내용을 바꾸려면 ?

 


 

기본제목을 달수있게 해보자

레이아웃에서는 제목, css, js등 바꿔줘야한다.

그 값이 바뀌어야한다.

라이브러리 추가할것


스프링부트가 너무느리다면 .. 

alt + enter : create Test 

멤버컨트롤러가 멤버서비스를 통해서 회원가입하고 멤버서비스를 통해서 데이터를 조회한다 (의존관계)

멤버컨트롤러가 멤버서비스를 의존한다

 

스프링 빈을 등록하는 2가지 방법

컴포넌트 스캔과 자동 의존관계 설정

 -컴포넌트 스캔 : @Controller @Service @Repository

컴포넌트 스캔 원리

 

@Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.

@Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.

@Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.

-@Controller

-@Service

-@Repository

 

아무클래스에 @어노테이션을 붙여도될까 ?

No. package에 포함된 하위애들을 찾아서 작동한다 


자바코드로 직접 스프링빈 등록하기

 

생성자주입 (권장)

 

필드주입

 

세터주입

아무나 세터를 통해 변경을 할 수있다.

 

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다


회원 웹 기능 - 조회

 

06/02

사용자가 전달한것을 받는방법 

쿠키란 ?

경로도 값이 될수있다.

rest방식 : url자체가 데이터를 찾아가는, url다르게 표현


경로에 id라는 변수를 넣어서 사용 


파일 입출력하는 방법

Restcontroller붙이는 객체화시킴

 

1.파일하나만올라가는경우 (비동기적)

2. 여러개 

application properties 

webapp을 refresh


파일을 2개얻어온다면


뷰(문서)는 홈디렉토리에 두면안되고 웹인포안에 둔다 (노출되지않도록)

컨트롤러가 기본어플리케이션

뷰는 출력하면 쓰는 옵션

사용자가 볼수없게한 용도 , 경로로 url로 접근못한다. 

컨트롤러를 통해서 jsp를 호출한다. 사용자가 직접요청할수없게 고쳐야한다

ex : 뷰에넣지않으면 edit.jsp를 아이디값없이 열수있게된다. 컨트롤러를 통해서만 열수있도록하고 사용자가 선택한 게시물의 id값을통해서만 열릴수 있도록한다. 

 

https://haileykim2014.tistory.com/238


뷰단을 제공하는것을 탑재하지않았다.

선택적으로 추가해줘야한다.

타임리프를 설정해야한다.

인덱스 리빌드하면 검색이 가능해진다 1시간소요

시간걸리므로 직접받아보기 https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper/9.0.46


CSS, 이미지,js폴더 static에넣기


페이지를 조각내고 집중화

 

Tiles 라이브러리 설정하기

헤더,어사이더,푸터는 공유하게된다

레이아웃부분만 따로 분리하는 도구가 생김

분리된 중첩된내용 + 작성해야할 페이지를 붙여서 반환

 

헤더,어사이드,푸터를 조각낼것

지시사항을 정할것 (ex customer.notice.list)

 

list.jsp 에서 푸더잘라내고 footer.jsp에 넣기

aside는 페이지별로 바뀔수있으므로 inc에넣으면 각각이름을 구분해줘야한다 -> 어드민에넣기

노티스 : 리스트(메인영역)

hello.html   / controller

helloController의 리턴"hello"가 templates의 hello.html을 찾아 랜더링한다

spring-boot-debtools 라이브러리를 추가하면 , 'html' 파일을 컴파일만 해주면 서버 재시작없이 view파일 변경이 가능

 

뷰 : 화면을 그리는데 집중

컨트롤러 : 내부역할 집중, 서버, 비지니스



mvc방식에서 뷰를 찾고 템플릿엔진을 통해 화면랜더링 html을웹브라우저에 넘겨줌

1. html

2. API방식으로 데이터를 넘기냐(객체반환)

 

@ResponseBody : http에서 바디부에 데이터를 직접넣어주겠다는 의미(return)

서버재실행 - 해당주소 - 검사- 페이지소스보기하면 문자그대로 출력된것이 확인된다

 

json방식으로 key value로 나옴

return에 객체를 넘기면 httpMessageConverter가 동작한다. ->

JsonConverter -> 키 값으로 변환해서 브라우저로보냄

 


클래스명에 마우스 위치후 alt + enter ==> Test Case 생성

겟요청의 쿼리값 받기


쿠키활용

 

다음에도 그대로 유지되서 문서를 만들기원한다면

서버에 전달하기위한 방법ㅇ ㅣ필요하다

현재값을 유지하려면 지금값을 꽂아줘야한다

 

1. 쿼리스링조작 

2. 상태가 유지될수있도록, jsp안에서 요청할때마다 계속꽂혀야하는값이있다.

 쿠키를 통해 쓰지않아도 올떄마다 가져오게한느방법

 

쿠키 : 클라이언트가 올떄마다 가지고오는 , 브라우저가 알아서가져옴, 페이지요청시 그값이온다. 

서버 4대저장소 페이지콘텍스트,리퀘스트,세션,어플리케이션

 

쿠키사용방법

클라이언트에게 다음부터가지고다녀라고 요청하는것

응답으로보내줌

 

임시적인 상태값 유지

쿠키 : 브라우저가 닫힐때까지 (브라우저가 쿠키를 기억함)

        쿠키로 사람을 식별하면 위조가능(보안적으로는위험)

         쇼핑몰에서 장바구니,   

        비회원에서 장바구니이용하면 브라우저에게 요청     

        사용자가 협조적이어야 ...

 

 

세션 : 서버는 연락이오고 연락이끊기면 브라우저와 상관없이, 마지막요청이 있고난 후 세션타임아웃이 제로가되면 

자원을해제한다.

       세션이 비대해지면 자원이 비대해지면 장소부족으로 부담이생긴다

       서버자원을많이쓰면 서버메모리많이씀

       회원이 장바구니이용

새로고침하면 콘솔출력

파람이라고하면 4대저장소가아닌 파라미ㅌ어ㅔ서찾는다

 

쿠키설정:

1생명주기 

2가시영역(어느범위내에서?)

 

브라우저는 프로세스가 닫혀야한다

브라우저창의 여러탭중에 탭을끄면 쓰레드하나끄는것뿐

위 크롬을 다닫아야 쿠키가 사라진다

브라우저 닫았다가 다시실행하면 query cookie : null

 

브라우저닫아도 담게하려면 ?

브라우저를 끄고 다시 키켜도 남아있다면 생명이 유지되는것


쿠키 가시영역

자식디렉토리에서는 같이쓸수있다.

상위(전체)에서쓰러면 범위를 넓혀야한다

쿠키는 무조건 문자

쿼리스트링에쓸 수있ㄴ느값만가능

 

 


쿠키가져오기

 


restAPI

id를 경로로 씀

나머지쿼리값은 그전처럼사용

https://deeplify.dev/back-end/spring/port-is-already-in-use

 

[스프링/Spring] Port 8080 is already in use 에러 해결 방법

스프링에서 가끔 발생하는 8080 포트는 이미 사용중이라는 에러에 대해서 알아보고 해결하는 방법까지 알아보도록 하겠습니다.

deeplify.dev

 

작업관리자 - 세부정보 - 자바파일 작업끝내기

netstat -ano

taskkill /f /pid 12345

+ Recent posts