StringBuffer 클래스

-String 처럼 문자열 배열(char[])을 내부적으로 가지고 있다.

-String과 달리 내용을 변경 할 수 있다. 변경가능

-문자열을 가지고 조작을 많일 할 경우 추가,변경 등 스프링버퍼가 유리

-StringBuffer(”abc”) : character 배열이 만들어진다.

-sb.append(”123”) : 새로운 문자열이 추가된다. 배열에 내용이 추가된다.

-배열은 길이 변경불가. 공간이 부족하면 새로운 배열 생성해야한다

-처음에 길이가 5인 배열을 만들어서 1~5저장후 6을 저장하고 싶다면 ?

-배열의 길이가 불가능

1. 새로운배열 만들기

2. 내용복사

3. 참조변경

-StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야한다. (공간이 부족하지않도록..)

-StringBufferString과는 달리 내용 변경이 가능하다.

StringBuffer sb = new StringBuffer(”abc”);

-append() 끝에 문자열 추가

-delete()삭제

-insert()삽입

-반환타입이 StringBuffer이다.

-sb.append(”123”).append(”zz”)가능한 이유가 반환타입이 StringBuffer때문

-StringBufferequals()가 오버라이딩 되어 있지않다. (주소비교) this==obj

-String은 내용비교

-StringBufferString으로 변환 후에 equals()로 비교해야 한다.

String s = sb.toString(); // sbString으로 변환

String s2 = sb2.toString();

System.out.println(s.equals(s2)); //true

 

 

package problemSolving;

public class Test1 {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("01");
		StringBuffer sb2 = sb.append(23);
		sb.append('4').append(56);
		
		StringBuffer sb3 = sb.append(78);
		sb3.append(9.0);
		
		System.out.println("sb="+sb);//sb=0123456789.0
		System.out.println("sb2="+sb2);
		System.out.println("sb3="+sb3);
		
		
		System.out.println("sb="+sb.deleteCharAt(10));//sb=01234567890
		System.out.println("sb="+sb.delete(3,6));//sb=01267890
		System.out.println("sb="+sb.insert(3, "abc"));//sb=012abc67890
		System.out.println("sb="+sb.replace(6,sb.length(),"END"));//sb3=012abcEND

	}

}

'2021 Newlecture > JAVA' 카테고리의 다른 글

클래스변수  (0) 2021.09.18
Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

클래스변수

자바프로그램은 클래스로만 구성이 되어있다.

메인메소드,변수선언,메소드선언 모두 클래스안에 있어야한다.

전체프로그램에서 변수를 딱 하나 선언해야할 경우에 쓴다.

전체프로그램 모두에서 공유한다.

그렇다면 공유할 변수를 어디에 둬야할까?

A클래스의 진영에만 쓸거면 A에넣으면되겠지만,

공유하려면? A?B?C?

좀더 연관이 깊은 클래스에 넣어주되, 공유하려면 누구나 접근할 수있게 static을 붙여준다.

 

Static 선언의 의미 :

이 변수는 공유할거야.

인스턴스 생성과는 별개로 하나만 존재하고 어디서든 접근가능

위치는 클래스안에 존재한다.

 

선언된 클래스의 모든 인스턴스가 공유하는 클래스 변수

InstNum이 인스턴스별로 존재한다면 값이 1일 것이다.

실제 출력하면 마지막 3이 출력된다.

  

클래스 변수의 접근 방법

클래스 내부 접근

static변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능

 

클래스 외부 접근

private으로 선언되지 않으면 클래스 외부에서도 접근가능

접근수준 지시자가 허용하는 범위에서 접근가능

클래스 또는 인스턴스의 이름을 통해 접근

 

클래스 변수의 초기화 시점과 초기화방법

클래스 변수는 생성자 기반 초기화 하면 안된다.

이 경우 인스턴스 생성시마다 값이 리셋

 

클래스 변수의 활용의 예

 

원주율 값은 클래스의 인스턴스별로 가질 수도있다.

굳이 인스턴스별로 유지할 필요없다.

인스턴스별로 자기네들이 값을 컨트롤해야할 때 필요하다.

PI값이 메모리에 저장되고 서로 공유한다.

어떤 상황에따라 바뀌어야한다면 참조되는 값만 바뀐다면

날씨정보를 실시간공유하듯이 사용할 수있다.

인스턴스별로 가지고 있을 필요가 없는 변수

값의 참조가 목적인 변수

값의 공유가 목적인 변수

그리고 그 값이 외부에서도 참조하는 값이라면 public으로 선언한다.

'2021 Newlecture > JAVA' 카테고리의 다른 글

StringBuffer클래스  (0) 2021.09.19
Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

Servlet  

서블릿이 요구하는 구현 규칙을 지켜주면서 서블릿을 정의해주면
http 요청 정보를 쉽게 사용할 수있고 처리결과를 쉽게 응답으로 변환 할 수 있다.

서블릿을 이용해서 웹요청을 다루게되면 개발자들이 진짜 집중해야할 비지니스 로직에 더 집중할 수있다.

서블릿이 생성되면 init메서드가 호출되고 소멸될때는 destroy()메서드가 호출된다.
서비스는 요청을 처리할때 호출이 되는 메서드다.

 

서비스의 로직수행: Get요청이 들어오면 doGet메서드를 호출하고
Post요청이 들어오면 doPost 메서드가 호출된다.
doxxx를 찾아 재정의해주는것

서비스 메서드만 재정의해서 처리 방법을 지정한다.

 


서블릿 컨테이너와 서블릿이 호출되는 과정
서블릿컨테이너 : 서블릿을 담아 관리하는 바구니
사용자 요청이 들어오면 서블릿 컨테이너는 해당요청과 매핑된 서블릿을 찾는다.

설정파일에 정의가 되어있다. 
/hello라는 요청이 들어오면 HelloServlet이라는 서블릿으로 처리하겠다

이 설정을 서블릿 컨테이너가 읽어서 어떤 서블릿이 필요한지 알게되면
서블릿 인스턴스가 컨테이너에 있는지 확인한다.

인스턴스가 컨테이너에 존재한다면 그 인스턴스를 그대로 사용한다.
없으면 생성해서 사용 ( 아까 서블릿의 init()메서드가 호출된다)

 

서블릿객체는 소멸되지 않고있다가 다음번 같은 요청이 들어왔을때 
서블릿 컨테이너에 의해서 또 호출되서 사용된다.
서블릿 컨테이너는 서블릿의 생명주기를 관리한다

1. Servlet Request/ Servlet Response 객체생성
2. 설정 파일을 참고하여 매핑할 Servlet을 확인
3. 해당 서블릿 인스턴스 존재 유무를 확인하여 없으면 생성 init()
4. Servlet container 에 스레드를 생성하고 res,req를 인자로 service실행

만약 여러 요청이 들어온다면 ?
스레드당 다른 서블릿이 처리할 수있고 여러스레드에서 한 서블릿의 여러 요청을 동시에 처리할 수있다.


Dispatcher Servlet이 web요청을 처리하는 과정

디스패처 서블릿은 모든 요청을 다받고 핸들러매핑이라는 애가 내 요청을 처리할때 
컨트롤러를 찾아서 반환하고 핸들러어뎁터는 그 컨트롤러의 메서드를 호출해서 처리로직을 수행

 

스프링으로 웹요청 :
스프링 mvc에서 제공하는 디스패처 서블릿과 웹 요청처리 관련 구현체들을 사용할 수있다
스프링 컨테이너 (스프링 Ioc)를 사용해서 개발 할 수 있다.
개발자로 하여금 핸들러, 요청처리 로직들에만 신경 쓸 수 있다.

 

Wrapper class 사용이유?

기본 data type은 객체가 아니어서 Object로 받는 다형성을 지원 할 수없다.
기본 data type을 객체로 변환시켜 전달하기위해 사용되며 auto boxing과 unboxing이 지원된다

Wrapper class 
기본자료형 값을 감싼다.
인스턴스안에 넣어두는걸로 이해하면 좋다.
왜 감싸느냐? 제네릭에서 자세히배운다

 

예시 1.

class UserWrapperClass{
	public static void showData(Object obj){
    	System.out.println(obj);
    }
}

인스턴스를 요구하는 메소드

이 메소드를 통해서 정수나 실수를 출력하려면 해당 값을 인스턴스화 해야한다.

 

메소드 showData를 정의한다.
인자로 무엇을 전달받아서 toString메소드를 호출한다. 이때 인스턴스가 전달되어야한다.
기본자료형값을 보낼 수 없다.
인스턴스를 보내야하는곳에 기본자료형을 전달하면 컴파일에러가 발생한다.

 

showData 모든 인스턴스를 인자로 전달받을 수있다. 그 인스턴스가 반환하는 문자열을 출력한다.
기본자료형은 object클래스를 상속하지않기떄문에 인자로 전달할 수없다.

 

기본자료형의 값들은 인자로 받을 수없다. 오브젝트를 상속하지않는다
String str = 3이나 5를 참조할 수 없는것과 비슷하다

 

기본자료형의 값들은 인자로 받을 수없다.
오브젝트를 상속하지않는다
String str = 3이나 5를 참조할 수없다.

public static void main(String[] args){
	Integer iInst = new Integer(3);
    showData(iInst);
    showData(new Double(7.15));
}


내가 가진것이 값이라면 래퍼클래스를 이용해 인스턴스안에 넣어둔다
3이라는 숫자가 인스턴스화되었다.
7.15라는 더블형값이 더블이라는 인스턴스에 감싸여져서 그 반환값이 showData메소드의 인자로전달되었다.

* 래퍼클래스에서 중요한것은 값을 인스턴스화시킨것

 

이렇듯 기본 자료형의 값을 인스턴스로 감싸는 목적의 클래스를 가리켜 래퍼클래스라고한다.

 

'2021 Newlecture > JAVA' 카테고리의 다른 글

StringBuffer클래스  (0) 2021.09.19
클래스변수  (0) 2021.09.18
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

String , StringBuffer,StringBuilder 차이점

1. String 
새로운 값을 할당할때 마다 새로 클래스에 대한 객체가 생성된다.
String에서 저장되는 문자열은 private final char[] 의 형태이기 때문에 String값은 변경 할 수없다.
String + String + String은 각각의 String주소값이 stack에 쌓이고 GC가 호출되기 전까지 생성된 String객체들은 Heap에 쌓이기 떄문에 메모리관리에 치명적이다.

 

인스턴스안의 저장된 문자열을 바꿀수없다

한번 생성되면 문자열을 바꿀 수 없다.
참조변수는 참조하는게 다임

str1이 str2를 참조해도 문제가안생긴다. 둘다 참조만가능하므로 ..

백개의 참조변수가생겨도 문제가 안생긴다.
새 인스턴스가 아니라 기존 값을 반환해준다.

새로운 인스턴스가 필요하다면 new로 새 객체생성가능

2. StringBuffer
동기화지원
각 메서드 별로 synchronized keyword가 존재한다.

3. StringBuilder
동기화 미지원
동기화를 지원하지 않아 속도가 빠르다.

'2021 Newlecture > JAVA' 카테고리의 다른 글

StringBuffer클래스  (0) 2021.09.19
클래스변수  (0) 2021.09.18
Wrapper class  (0) 2021.08.22
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

Pull Request

Pull Request 란 ?

  • 코드리뷰를 위해 / Push 권한이 없는 오픈 프로젝트에 기여할때
  • 레파지토리의 한 브랜치에 푸시한 변화를 다른사람에게 알려준다.
  • pull request가 open되면 기본 브랜치에 머지하기전에 콜라보레이터와 코드변화를 리뷰하고 논의 할 수있다.

Pull Request 보내는 방법

1. 기여하려는 저장소 fork 

기여하려는 프로젝트의 상단에서 fork 클릭 !

owner 의 레파지토리를 fork

2. fork한 저장소의 git주소를 clone 

- fork한 자신의 레파지토리 주소를 clone한다.

- clone한 프로젝트가 열린다.

 

3. 원격저장소 설정

Git - manage remotes - '+'버튼

- origin에는 본인의 레파지토리가 들어가있고

- 원격저장소에 owner의 레파지토리를 추가한다.

 

원격저장소 추가

4. Branch 생성 

- Git - branches - new branches 

develop라는 브랜치를 추가한다.

- 브랜치 추가는 필수는 아니라고함..어떻게 관리하느냐에따라 달라지는듯..

 

5. 코드 수정

 

6. commit and push

- commit : git → commit or ctrl + k

- 커밋메세지 적고 커밋

- push : git →  push or ctrl + shft + k 

- 이때 본인의 레파지토리 (origin)에다가 push를 한다.

- owner에 push는 불가능한 상황임..

푸시 완료 

7. github사이트에서 fork한 나의 저장소에 들어가기 

- 방금 push한 알림이 떠있다.

- 또는 pull requests에서도 확인가능 

8. compare & pull request 클릭

- 내가 수정한 코드가 확인이 된다.

- 기여한것들을 작성 후 create pull request를 눌러 Owner의 승인을 기다린다. 

- onwer가 승인하면 그때 merge가 된다. 

 

참조

https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests

 

https://www.gitkraken.com/learn/git/tutorials/what-is-a-pull-request-in-git

 

'2021 Newlecture > Git&GitHub' 카테고리의 다른 글

GIT Commit and push  (0) 2021.05.19
  • 학생인증이 되면 intellij Ultimate버전을 1년동안 무료로 사용이 가능
  • 매년 갱신해야함
  • 졸업 후더라도 학교메일계정이 살아있으면 인증가능
  • 학생인증에는 깃헙 및 다른 방법도 있다고함..

1. Jetbrains 접속 → Apply now 

https://www.jetbrains.com/community/education/#students

 

2. 정보입력 - 학교이메일 계정입력

입력을 완료하면 인증을 위한 메일을 발송했다고 메세지가 뜬다.

3. 학교 이메일 확인 → follow this link 클릭

 

4. 최종인증 → I accept 클릭

 

5. 회원가입 → Sign up →  메일주소 기입

 

6. 가입 이메일 확인   Confirm your account 클릭  정보기입

7. 로그인하면 학생 라이센스 확인 가능

유효 기간 및 라이센스번호가 확인된다.

 


IntelliJ IDEA 다운로드 

https://www.jetbrains.com/idea/download/#section=windows

리액트복습

  • 리액트 컴포넌트껴넣는 과정 익숙해지기
  • 스타일이 깨지지않게 주의할것
  • ReactDom이 필요하면 import해야함..
  • 컴포넌트 두가지 : 함수형(가볍게 페이지분리해서 사용) / 클래형 (state를 이용한 데이터 바인딩필요)

원하는 프로젝트폴더에서 react app 설치

 

리액트앱설치한 폴더(package json)이 들어있는 폴더에서 npm스타트

index.js가 App을 import하고있다.

App.js에서 리턴값에 원하는걸 넣어서 화면에 출력한다.


html폴더에서 필요한것만 쓰자

html폴더의 index에서 바디부분만 가져오자.

function App()의 리턴에 넣어준다.

이때 에러가 발생

반드시 전체를 감싸는 태그가 있어야한다.

<div>중첩이 발생

 

Header는 주로 데이터를 바인딩하지않는다

메인쪽이라 함수형으로하자

 

()=>3; // 함수를 정의하는데 3을 리턴하는 함수, 무명

header.js만들고, header부분 리턴하는 함수만들기

class를 className으로 변경


라우팅하기위한 라이브러리 설치

url요청에따라서 스위칭

a 태그대신 Link태그로

/이게 우선순위가 제일위로..처리됨.

"/"를 밑으로둘수도있지만 exact를 넣어주면 딱 정확한 url이된다(패턴x)

'2021 Newlecture > Node & React' 카테고리의 다른 글

React : bind() / Mounting / fetch  (0) 2021.06.23

bind()

값이 변경하면 그것에대한 변수를 자동으로 변경해주지않는다. onChange를 써줘야한다.

함수를 다른함수로 위임할때, 객체없이 호출하는 일이 발생했다.

this를 사용할수없는 인스턴스함수가되었다.

위임했던 메소드는 this를 쓸수없다

해결방법은 ?

 

자료형식으로부터 유연함

자료형식에 구애를 받지않는,

 

함수형태를 담는 형식ㅇ ㅣ정의되어있어야한다 

스크립트언어들은 형식명을 거론하지 x (ex var)

다 담을  수 있다는얘기

 

exam을 넘길수있는대안을 써야한다.

f1한테 위임할때, 바인드함수를 사용할수있다. bind()

bind(exam)을 쓰면 객체가 안에 바인드되서 전달된다.

f1() : 객체없이 함수호출하고있음.

인스턴스메소드를 위임할때 bind()를 쓸것

 

state는 여러개로 들어온다.

나중에뒤에있ㄴ는 state로 덮어쓰여진다.

 

이벤트가 발생하면 정보를 주는것 

이벤트가 발생한 객체를 알려줌

저장될 구조를 미리 정의 (state가있을것이다.)

 

1.객체를 얻어서 값을 얻는 방법

2. 리액트 방식으로 객체를 얻어서 값을 얻는 방법

input의 value값을 얻어온다 value={this.state.x}

3. ..


백엔드로만 할래, 프론트로만 할래

return값을 실제연결할 html이름으로 변경


1.데이터요청도구가 달라졌다

promise을 이용한 비동기처리 (fetch API)

 

mount : 화면에  뜨다

constructor : 생성자가 제일먼저 호출됨(멤버변수만 초기화) : 화면과 상관없이 변수를 마련해서 변수에 초기값설정

화면을 초기화하려면 ? 

render : 화면에 출력할것

componentDidMount : 화면에 로드되자마자 초기화할떄

 

순서 : render 를 하면서 <List>객체가 생성되고 , contructor생성자가 호출되고 render() {}가되고 componentDidMount가 된다

1.constructor, 2.render 3. mount

렌더는 언제호출될까

인풋이 바뀔때마다 랜더가 호출된다. 화면상태가 바뀔때마다 호출


서버쪽에있는 데이터를 가져오자

페치하는것을 어디서 가져오는게 좋을까

1 생성자 2 랜더 3 컴포넌트디드마운트

 

랜더는 문제가 있음 : 데이터 가져오는 작업을 계속 반복한다

 사용자가 인풋에 값을넣을때마다 랜더가 계속 호출된다(콘솔에 랜더)

사용자의 화면상태가 바뀔때마다 랜더호출 , 무한반복이된다.

 

화면이 바뀌었다가 하고싶은 게있어 ? ->componendidupdate

 

순서 : 생성자 - 랜더 - 딛어마운트 - 랜더(다시) - 후처리(딛업데이트)

 

바겼다가 후처리 : didUpdate

랜더-업데이트

데이터를 제공해주는 녀석만들기

api는 하나의 약속이다.

한번 api/notice/3으로 서비스했으면 못바꾼다

경로가 데이터형태.

계층화된 데이터구조

질의x

 

삭제할떄는 요청자체를 delete

list와 count 모두 반환할 수있는것

1.dto

2Map (키:문자열) 

 

@RestController 데이터 자체를 리턴

json형태나옴

fetch절대경로

 

 

목록으로된것을 바인딩

list배열[]이 갖고있는것 {"id":92032943},{"id":92032942}
배열의 기능이용

map : 배열의 항목을 가지고 변환해서 새로운 배열을 만들때 사용

다른모양

제이슨과 list의 구조가같아서 바로넣는데, 다를경우 각각 만들어줘야한다

'2021 Newlecture > Node & React' 카테고리의 다른 글

리액트복습  (0) 2021.06.28

ECMA Script 6 / 2015 강의 08 -object destructuring


ECMA Script 6 / 2015 강의 09 - Object Destructuring #2


ECMA Script 6 / 2015 강의 10 - Object Destructuring #3 중첩과 적응(뽀개기 중첩과 적용)

객체가 가지고 있는 속성의 이름을 전체네임으로 바꾸려면 ?

객체가 중첩된 경우


ECMA Script 6 / 2015 강의 11 - Array Destructuring #1

let을 통해 변수 선언

나중에 temp배열에 담긴 값으로 바꾸려면 ? (다른배열을 이용하고싶을때)

배열뽀개기를 이용한 순서 재배열


ECMA Script 6 / 2015 강의 12 - Array Destructuring #2

기본값 설정하기

배열이 가지고있지않은  속성에  기본값 설정하기

변수선언과 동시에 값대입 kor4=40
,콤마를 써서 두번째배열을 가리키게된다


ECMA Script 6 / 2015 강의 13 - Set 콜렉션

객체지향언어에서 컬렉션이 내장되어있다.

언어가 컬렉션을 지원 (자바,씨샵 등등)

컬렉션 : set, list , map

컬렉션들은 데이터를 수집한다(데이터를 담을 수 있다). 가변길이의 데이터공간

*데이터를 식별하는 키값이 다르다.

map : 데이터를 수집하면서 데이터식별키를 같이 심는다.

        "내가 맡겼던 타이틀줘"

list : 데이터를 담고 , 식별자를 담지않는다. (데이터를 담는 순서가 식별자)

     "내가 맡긴 0번째 줘"

set : 식별자가없다. 데이터가 식별자 (so, 같은값 저장불가능, 중복된 값 허용 x)

     "컬렉션에 5가 담겨있니" -> 값들을 특정 지어서 꺼낼 수 없으니 나열할 수 있는 기능이 필요 ->이터레이터등장

 

*배열의 항목에 중복값이있을때 중복제거가능 ->set이 중복제거해줌

 

*for in : 키 값 얻어줌

*for of : 값을 하나씩 꺼내줌

https://haileykim2014.tistory.com/211

forEach , entries로 키와 값을 출력할수있다.


ECMA Script 6 / 2015 강의 14 - Map 콜렉션

map을 사용할때 exam.set할수도있고 배열형태로 중첩해서 사용가능, 반환해서 쓸때도 배열형태모양으로 가능


ECMA Script 6 / 2015 강의 15 - Rest Parameters

...values 나머지것들에 대해서 컬렉팅(나머지것들에 대해서 인덱스 0부터)

별칭을 지정하지않은것은 arguments로도 가능

 


ECMA Script 6 / 2015 강의 16 - Spread Operator

갖고있는값을 흩뿌려줘

각각 나누어서 전달

단순히 함수에 전달하는 목적x + 값을 나열하기 위해 사용


ECMA Script 6 / 2015 강의 17 - Default Value의 이전방식과 현재방식


ECMA Script 6 / 2015 강의 18 - Arrow Functions와 그 특징

print()안의 this : window객체라서 console.log(kor)하면 10이 출력, 전역변수

Arrow function은 애초부터 함수의 기능만 수행하도록 만들어짐

오로지 리턴만있다면 괄호제외가능

매개변수하나일경우

var fun = x =>x


ECMA Script 6 / 2015 강의 19 - class를 이용한 객체 정의

은닉화 문제발생

console.log(exam.kor) // 10 출력, 속성을 은닉화해야한다.


ECMA Script 6 / 2015 강의 20 - class 멤버 은닉하기

함수도 은닉화가능


ECMA Script 6 / 2015 강의 21 - static 멤버 정의하기

static : 객체마다 동일한 속성이 존재할 경우 사용, 객체와 상관없이 전역변수화

클래스명.스테틱변수명 (울타리내에있다)

객체생성과 상관없이 사용가능

객체를 만들지않고도 사용할 수있는 static메소드

메서드는 객체화되지않는다. 메서드는 데이터가 아니다. 함수는 절차니까 흐름에왔다갔다.

호출될떄마다 만들어질필요 x

false (같은기능의 함수인데, 다르다고나온다)

프로토타입

객체가 다르면 데이터가 달라지지만 함수는 같은함수쓰도록하자.

프로토타입이란 ?

 

ex 배경색바꾸기, 기본도형설정 

new할때마다 aa라는 속성을 가져야할때 

Exam.prototype.aa = 30;

객체가 생성되지않아도 프로그램이 실행이 되는순간 만들어짐.전역변수,

하나만 가지고 공유

private static : 클래스안에서만 사용

false : Exam을 만들때마다 객체생성이되므로 각각 다르다.
true 같은애들

기본도형에 넣으면 하나로 공유.

인스턴스 호출전에 항상 먼저 준비됨.

단일하게 처리

함수는 프로토타입으로 ! 

 


객체지향

-행위 또는 처리하는 함수

-데이터객체를 만들어서 초기화하는 목적의 함수 :  생성자 함수

위 : true / 아래 : false

=== : 참조비교

print()안의 this : 전역객체, window 

Exam()안의 this : new를 통해 호출한 함수. exam을 가리킴

 

this생략불가능. 무조건 써줘야한다.

1.지역변수

2.매개변수

3.인스턴스변수


클래스 특징

new를 통해서만 호출

클래스내 데이터만열거(메소드제외)

strict 모드 : 변수 중복선언 불가능, 변수선언안하고 쓰는것도 오류발생 ->let ,const (es6)

 

캡슐화 : 속성+ 기능

컨트롤러 :

서비스(업무로직)

다오(데이터)

데이터베이스

뷰(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 회원 서비스 스프링 빈 등

 

명령어 Windows CMD Max OS Terminal
현재 디렉토리 cd pwd
현재 디렉토리 파일 리스트보기 dir ls
디렉토리 이동 cd cd
디렉토리 생성 mkdir mkdir
디렉토리 삭제 rmdir rmdir
화면 클리어 cls clear
null 파일 생성 type NUL> touch
파일삭제 del rm
파일이동 move mv
파일/디렉토리 이름바꾸기 ren mv
Explorer / Finder 에서 열기 start open

In Powershell, you can use the ni command, for example: ni test.js

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 생성

+ Recent posts