오늘 공부한 내용

  • 스프링 숙련주차 재시청
  • 코드카타 문제 토의
  • 코드카타 2문제

 

새로 알게된점

* replace 메서드, replaceAll 메서드

코드카타 문제 푸는 도중 새로운 메서드를 알게 되었다.

 

replace 메서드  문자열의 특정 문자를 지정 문자로 대체 후, 문자열 반환하는 메서드이다

작성시 replace(찾을문자열, 바꿀문자열) 형태로 파라미터 안에 내용을 적어주면 되는데

예시로

class pratice{
    public static void main(String[] args){
        String str = "I have a pen. I have an apple.";
        str = str.replace("I", "You"); 
        System.out.println(str);  // You have a pen. You have an apple.
    }
}

적으면 "I"에 해당하는 글자를 "You" 로 바꾸어서 출력한다.

 

replaceAll 메서드 는 replace 메서드 와 동일하게 작동한다.

사실 replace 부분을 replaceAll 로 바꾸어도 상관은 없다.

다만 차이점이 무엇이나면 둘이 들어가는 인자값이 다르게 적용이 된다.

 

String replace (CharSequnce target, CharSequence replacement)

String replaceAll (String regex, String replacement)

 

위 처럼 replace는 인자값이 CharSequnc 형태로, replaceAll 인자값은 String 으로 적용되는데 여기서

replaceAll 경우 첫번재 값이 regex 라는 정규식 형태로 값이 들어가게 된다.

정규식으로 처리한다면 불특정 문자열을 변환할수 있는 장점이 있습니다.

 

예시 로

class pratice{
    public static void main(String[] args){
        String str = "aaabbbccccabcddddabcdeeee";
  
  		String result1 = str.replace("abc", "왕");
  		String result2 = str.replaceAll("[abc]", "왕");
  
  		System.out.println("replace result->"+ result1);
  		System.out.println("replaceAll result->"+ result2);
    }		
}

// replace    result -> aaabbbcccc왕dddd왕deeee
// replaceAll result -> 왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee

이런 형식으로 replace 메서드는 정해진 값만 일부 변강하게된다

여기서 [abc]는  정규식 표현으로 [abc]는 []안에 있는 문자들을 전부 왕으로 변환시켜준다.

즉 a , b , c 3가지의 문자를 만나면 전부 치환대상이 되는것이다.

 

여기서 만약 replace를 정규식을 사용하지 않고 replaceAll 와 같은 동일한 값을 얻고 싶다면

class prac{
    public static void main(String[] args){
        String str = "aaabbbccccabcddddabcdeeee";
  
  		String result1 = str.replace("a", "왕").replace("b", "왕").replace("c", "왕");
  		String result2 = str.replaceAll("[abc]", "왕");
  
  		System.out.println("replace result->"+ result1);
  		System.out.println("replaceAll result->"+ result2);
    }		
}

// replace result    -> 왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee
// replaceAll result -> 왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee

위처럼 replace에 들어가는 인자값을 하나하나 일일히 적어주어야만 적용이 되게 된다.

 

 

느낀점

코드 카타를 점점 하다보면 정말 사람들이 이렇게 하면 적용할수 있구나 싶을정도로 다양한 방법이 나온다.

지금은 문제를 해결하기 보다는 작성하기위하여 다양한 메서드를 익혀놓아야 추후에 문제를 풀시 다양한 접근방법으로 적용하여 풀수있도록 반복 암기하 중요할거 같다. 

   

오늘 공부한 내용

  • 스프링 숙련주차 재시청
  • 코드카타 2문제

 

새로 알게된점

* Math.max, Math.min 메서드

Math.max 함수는 숫자 집합중에 가장 큰 수를 리턴하는 함수이며, 

Math.min 함수는 숫자 집합중에서 가장 작은 수를 리턴하는 함수이다.

 

 

 

 

Math.max(파라미터 1, 파라미터 2)

 : 인자1과 인자2 중 큰 값을 리턴 

 

Math.min(파라미터 1,파라미터 2)

 : 인자1과 인자2 중 작은 값을  리턴 

 

파라미터에는 int, double, float 등 다양한 타입을 넣어 비교 가능하다

 

class Compare{
	public static void main(String args[]) {
    	
		Math.max(3.14,5.18); -> 5.18 

		Math.min(33,77) -> 33 
        
   	}
}

오늘 공부한 내용

  • 베이직반 보충수업 / CRUD 작성 복습
  • 코드카타 2문제
  • 스프링 입문 영상 재시청

 

새로 알게된점

 

* SOLID (객체 지향 설계)

SOLID 원칙이란 로버트 마틴이 소개한 객체 지향 프로그래밍 및 설계의 5가지 기본 원칙을 말하며, 5가지의 원칙의 앞 글자를 따서 “SOLID”라고 부른다.

  1. SRP (Single Responsibility Principle) : 단일 책임 원칙
  2. OCP (Open/Closed Principle) : 개방/폐쇄 원칙
  3. LSP (Liskov Substitution Principle) : 리스코프 치환 원칙
  4. ISP (Interface Segregation Principle) : 인터페이스 분리 원칙
  5. DIP (Dependacny Inversion Principle) : 의존관계 역전 원칙

 

  • 단일 책임 원칙

하나의 객체는 반드시 하나의 기능만을 수행하는 책임을 갖는다는 원칙이다.

이는 클래스를 변경하는 이유는 오직 하나뿐이어야 한다는 것과 같은 의미를 말한다.

객체가 담당하는 동작, 즉 책임이 많아질 수록 그 객체의 변경에 따른 영향도의 양과 범위가 매우 되는데

SRP를 코드에 적용하면, 책임 영역이 확실해져 한 책임의 변경에서 다른 책임의 변경의 연쇄작용에서 자유로워 지며

즉, 코드의 의존성과 결합도를 줄이게 된다.

단일 책임 원칙은 특정 객체의 책임 의존성 과중을 지양하기 위한 중요하고 기본적인 원칙입니다.

 

SRP를 위반한 코드

다음의 코드는 단일 책임 원칙을 위반하고 있다.

public class Animal {

    private String animal;

    public void setAnimal(String animal) {
        this.animal = animal;
    }

    public void cry () {

        if(animal == "Dog") { // 강아지
            System.out.println("bark!");
        }
        else if(animal == "Cat") { // 고양이
            System.out.println("meow..");
        }
    }

}

다음의 Animal 클래스에서는 동물의 울음소리를 출력하는 cry() 메서드를 구현하고 있다. cry() 메서드는 Animal의 값이 "Cat"이면 고양이 울음소리를, "Dog"면 강아지 울음 소리를 출력하는데 즉, 두 기능이 분리되어 있지 않고 하나의 메서드가 두 기능을 모두 가지고 있으므로 단일 책임 원칙을 위반하고 있다.


SRP를 적용한 코드

다음 코드에서는 단일 책임 원칙 위반 문제를 해결하기 위해 추상 클래스를 만들어 각각의 하위 클래스에서 메서드를 상속 받아 사용하고 있다.

abstract class Animal {
    abstract void cry();
}

class Dog extends Animal {
    @Override
    void cry() {
        System.out.println("bark!!!");
    }
}

class Cat extends Animal {
    @Override
    void cry() {
        System.out.println("Meow...");
    }
}

위의 코드에서는 공통기능인 추상 메서드 cry()를 가진 추상 클래스 Animal을 만든 것이다.

그리고 각각의 Dog, Cat 클래스를 만들어 Animal을 상속 받아 각자의 클래스에 자신의 울음소리만을 구현한다.

즉, 하나의 클래스에 하나의 기능을 가지고 있게 되는것 이다.


⭕️ 정리! 단일 책임 원칙 (SRP)

작성된 클래스는 하나의 기능만을 가지며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다.

 

오늘 공부한 내용

  • Spring 백오피스 프로젝트 / 리뷰 CRUD 만들기
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

 

새로 알게된점

  • isDeleted 기능

프로젝트 구상중 팀원이 낸 의문점으로 가게나 메뉴가 사라졌을 경우 나중에 사업자가 정산을 받거나 세금 정리등 이전 자료를 필요로 할때 주문이나 리뷰 같은 과거의 정보는 남아 있어야 확인이 가능하지 않냐는 의문을 제시 했다.

 

이에 엔티티에 Boolean 타입으로 isDeleted 필드를 추가 하는것으로 해결 가능하다

조회를 할 때도 isDeleted true만 제외하고 조회를 하면 된다고 하는데 자세한 내용을 좀더 찾아 보아야 할거 같다

오늘 공부한 내용

  • Spring 백오피스 프로젝트 / 리뷰 CRUD 만들기
  • 베이직 클래스 보충수업 / 데이터 베이스 실습
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

 

새로 알게된점

  • Entity 매핑, @어노테이션 구분

1. @Entity 

@Entity 어노테이션은 JPA를 사용해 테이블과 매핑할 클래스에 붙여주는 어노테이션이다. 이 어노테이션을 붙임으로써 JPA가 해당 클래스를 관리하게 된다.

속성 기능
name JPA에서 사용할 엔티티 이름 지정
name을 쓰지 않을 경우 (default) 클래스이름을 엔티티 이름으로 지정

아래의 코드 결과를 보면 name = "user2"로 함으로써 user2 테이블이 생성된 것을 볼 수 있다.

@Entity(name = "user2")
public class User {}

테이블 생

2. @Table

@Table은 엔티티와 매핑할 테이블을 지정

속성 기능
name 매핑할 테이블 이름
생략시 엔티티 이름(@Entity(name="~") 사용
catalog catalog 기능이 있는 DB에서 catalog 매핑
schema schema기능이 있는 DB에서 schema 매핑
uniqueContraints DDL 생성시 유니크 제약조건 생성
 스키마 자동 생성 기능을 사용해 DDL을 만들 때만 사용

아래 코드 결과를 보면 @Table에 name을 추가하면 테이블이름이 name값으로 설정이 되고 생략시 Entity이름으로 테이블이 만들어지는 것을 확인할 수 있다.

@Entity
@Table(name = "user3")
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

user3 명칭으로 테이블 생성

@Entity(name="user2")
@Table
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

user2 명칭으로 테이블 생성

 

3. @Id

@Id는 특정 속성을 기본키로 설정하는 어노테이션이다.

@Entity
@Table(name = "User")
public class User {
    @Id
    private Long id;
    private String name;
}

@Id 어노테이션만 적게될 경우 기본키값을 직접 부여해줘야 한다.

하지만 보통 DB를 설계할 때는 기본키는 직접 부여하지 않고 Mysql AUTO_INCREMENT처럼 자동 부여되게끔 한다.

@Entity(name="user2")
@Table
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

@GeneratedValue 어노테이션을 사용하면 기본값을 DB에서 자동으로 생성하는 전략을 사용 할 수 있다.

전략에는 IDENEITY, SEQUENCE, TABLE 3가지가 있다.

속성 기능
@GeneratedValue(startegy = GenerationType.IDENTITY) 기본 키 생성을 DB에 위임 (Mysql)
@GeneratedValue(startegy = GenerationType.SEQUENCE) DB시퀀스를 사용해서 기본 키 할당 (ORACLE)
@GeneratedValue(startegy = GenerationType.TABLE) 키 생성 테이블 사용 (모든 DB 사용 가능)
@GeneratedValue(startegy = GenerationType.AUTO) 선택된 DB에 따라 자동으로 전략 선택

위 처럼 다양한 전략이 있는 이유는 DB마다 지원하는 방식이 다르기 때문이다.

AUTO 같은 경우DB에 따라 전략을 JPA가 자동으로 선택한다. 이로 인해 DB를 변경해도 코드를 수정할 필요 없다는 장점이 있다.

 

4. @Column

@Column은 객체 필드를 테이블 컬럼과 매핑한다.

@Column
private String name;
속성 기능
name 필드와 매핑할 테이블의 컬럼 이름 지정
default는 필드이름으로 대체
insertable true : 엔티티 저장시 필드값 저장
false : 필드값이 저장되지 않음
updatable true : 엔티티 수정시 값이 수정
false : 엔티티 수정시 값이 수정 되지 않음
table 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용
nullable  null값 허용 여부 설정
false : not null 제약 조건
unique 컬럼에 유니크 제약조건 부여
columnDefinition 데이터베이스 컬럼 정보를 직접 부여
length 문자 길이 제약조건
String 타입일 때 사용
precision, scale BigDecimal 타입에서 사용
precision : 소수점을 포함한 전체 자릿수 설정
scale : 소수의 자릿수

 

 

오늘의 느낀점

오늘 베이직 수업을 들으면서 @Entity 구성에 많이 사용되는 Jpa 어노테이션을 재복습 하는 시간을 가졌다.
해당 어노테이션이 자세하게 파고 들지은 않아서 어떤 역할을 하는지  대충 알고있는 형태로만 알고 있었는데 이번 프로젝트를 하면서 어노테이션에 대해서 세부적으로 기본개념에대한 설명을 읽으면서 알아보니 좀더 잘이해가되어 앞으로도 적용하는데 도움이 될거 같다.

 

오늘 공부한 내용

  • Spring 백오피스 프로젝트 / 리뷰 CRUD 만들기
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

 

새로 알게된점

  • JetBrains IDE에서 제공하는 Code With Me

Code With Me란 IntelliJ 기반 IDE에서 기본적으로 제공하는 공동 프로그래밍 기능으로 이를 사용하면 전문 개발자가 물리적으로 서로 다른 위치에 있는 경우에도 동일한 코드 기반에서 실시간으로 원활하게 작업할수 있다.

 

 

오늘의 느낀점

오늘 프로젝트의 기본적인 Entity를 구상하기위하여 코드작성에 들어갔다.
이전 조에서는 코드짤때 각자 코드를 짠후 합치는 형식이었는데 이번에는 팀장,팀원 분들이 Code With Me 를 통해 짠후 각자 작업에 들어가자고 얘기하자 나는  Code With Me를 처음 들어서 뭔지 모르는 상태로 가만히 있었다.
잠시후 팀장인 원호님이 인텔리제이로 팀원들을 초대하여 하나의 프로젝트에 다같이 들어오게 됬고 여기서 바로 코드를 짜면 각자 똑같이 반영되며 동시에 빠르게 수정할수 있었고 덕분에 팀원들이 작성하는 코드를 바탕으로 작성후 서로 보완해주면 빠르게 마칠수 있었다.
코드 공부를 하며 지금 사용하고 있는 인텔리제이 에서 이런 기능까지 있는줄은 전혀 몰랐다.
이뿐아니라 github등 앞으로 개발자 생활하는데 있어서 도움이 되는 기능 및 프로그램에 대해 찾아봐야 겠다고 느끼게 됬다.

오늘 공부한 내용

  • Spring 심화 팀별과제 발제 / 백오피스 프로젝트
  • 프로젝트 구상 
  • 베이직반 보충수업 / 
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

- 이번 백오피스 프로젝트로 배달의민족 같은 음식배달 페이지를 만들기 위해서 들어갈 기능에대해 API를 구상하면서 추후 백오피스에 적용가능하도록 세부적으로 작성하다보니 많은 시간이 소요됨

 

새로 알게된점

  • API, ERD, 와이어프레임 등 설계에 시간이 많이걸릴지라도 정확한 구상은 프로젝트의 전체기간을 줄일수 있다.
  • @PathVariable,@RequestParam, @ModelAttribute, @RequestBody 에대한 개념
    1. @PathVariable
      • 개념 : URL 경로에 포함된 변수를 컨트롤러 메서드의 매개변수로 바인딩하는 데 사용된다.
      • 특징 : 
        • URL 경로의 일부를 변수로 사용하여, 동적으로 변하는 URL 경로를 처리할 수 있다
        • 간결하고 직관적인 API 경로를 설계할 수 있다.
    2. @RequestParam
      • 개념 : 클라이언트가 전송하는 HTTP 요청 파라미터를 컨트롤러 메서드의 매개변수로 바인딩하는데 사용
      • 특징 :
        • URL에서 지정된 이름의 파라미터를 메서드 매개변수로 전달한다.
        • 필수 여부, 기본값 설정 등의 추가적인 설정이 가능하다.
    3. @ModelAttribute
      • 개념 : 요청 파라미터를 객체로 매핑하여, 복잡한 데이터 구조를 쉽게 다루게 해준다.
      • 특징 :
        • 폼 데이터의 각 필드가 객체의 필드와 자동으로 매핑한다.
        • 복잡한 객체 구조의 데이터를 간편하게 처리한다.
    4. @RequestBody
      • 개념 : 클라이언트가 전송하는 HTTP 요청의 본문(body)을 Java 객체로 변환
      • 특징 : 
        • HTTP 요청 본문의 내용을 자바 객체로 역직렬화 한다.
        • 주로 JSON 또는 XML 형식의 데이터 처리에 사용 한다.

 

 

 

오늘의 느낀점

CRUD를 작성하면서 어느정도 따라칠수 잇었지만 정확한 구조에대해서는 잘 이해가 못가는 상태로 적고 있었다.
베이직 클래스 수업에서 알려준 어노테이션에 대한 개념을 이해하기 쉽게 알려주어서 내가 작성하는 CRUD에 어떻게 들어가는지 이제 감이 오기 시작햇다.

 

 

오늘 공부한 내용

  • Spring 심화 영상 시청
  • Spring 심화과제 테스트 해설영상 시청, 따라치기
  • 코드카타 2문제

 

어려웠던 내용

  •  테스트 안에 사용되는 코드에 대한 이해도가 낮다.

 

새로 알게된점

아스키코드 (ASCII) : 미국 ANSI(미국 국가표준 협회)에서 표준화한 정보 교환용 7비트 부호체계

  • 아스키 코드 특징
    1. 영어 알파벳을 사용하는 대표적인 문자 인코딩
    2. 컴퓨터와 통신장비를 비롯하여 문자를 많이 사용되는 장치에 사용
    3. 대부분의 문자 인코딩이 아스키코드에 기초를 두고있다.

아스키 코드 구조 표

  • 출력 가능한 문자들
    • 영문 알파벳 대 + 소문자 52개 ( 65 ~ 90, 97 ~ 122 )
    • 숫자 0 ~ 9 총 10개 ( 48 ~ 57 )
    • 특수문자 32개 ( 33 ~ 47, 58 ~ 64, 91 ~ 96, 123 ~ 126 )
    • 공백문자 1개 ( 32 )
  • 아스키 코드 사용경우

컴퓨터는 문자를 인식할수 없기 때문에 숫자만 알 수 있다. 때문에 문자 또한 숫자 형태로 인식하게 되는데 이때 아스키코드를 참조하여 숫자를 문자로 표현 할 수 있게 된다.

 

여기서 문자 A의 아스키 코드값은 65이다. 그럼 65 숫자를 char형으로 출력해주면 어떻게 나올까?

public class Main {
	public static void main(String[] args) {
    	System.out.println((char)65);
	}
}

결과는 "A " 가 나오게 되며 여기서 반대로 문자인 A를 INT형으로 출력하면

public class Main {
	public static void main(String[] args) {
    	System.out.println((int)'A');
	}
}

결과는 65가 나오게 된다.

 

 

오늘의 느낀점

 

코드카다 문제에서 일정 코드를 작성시 집합 안에 문자열로 숫자와 글자가 들어있는 경우 false, 숫자만 들어있는 경우 true 로 증명하라는 형태의 문제가 있었는데 작성중 답변을 구하기위해 문자를 숫자형으로 숫자형을 다시 문자형으로 바뀌기 위해 코드를 짜다보니 오히려 어지럽고 작성이 잘안됬었다.

그러던중 숫자로 문자를 나타내는 아스키코드를 알게되었고 이를 이용하니 좀더 편안하게 코드를 짤수 있게 되었다.

컴퓨터는 복잡한 일을 할수 있을것 같지만 세심히 들여다보변 복잡한 일을 하기보다는 정해진 규칙대로 반복적인 일을 수행할뿐이며 결국 사람이 코드를 짜주어야 다양한 일을 할수 있겠다라고 느끼게 됬다.

오늘 공부한 내용

  • Spring 심화 영상 시청
  • Spring 심화과제 테스트 작성
  • 코드카타 2문제

 

어려웠던 내용

  •  개념은 이해했는데 응용이 어렵다...

 

새로 알게된점

테스트 코드 ( 단위테스트, 통합테스트)

테스트코드를 작성 하는 이유

- 테스트란 의도된 대로 정확히 작동하는지 검증하는 절차이며 코드 수정시 예상치 못한 부작용을 방지할수 있다.

단위 테스트 : 소스 코드의 개별 단위로 한가지의 기능 테스트 하는 방법

  • 장점 
    1. 프로그램의 각 부분별로 테스트 하여 개별부분을 올바른지 확인하여 문제점을 찾기 쉽다
    2. 코드변경시, 변경한 부분으로 인한 영향도를 쉽게 파악가능 하다
  • 단점
    1. 일정 기능대한 작동하는 코드로 외부 종속성과 올바르게 작동하는지 확인알수 없다.

 

통합합 테스트 : 단일 테스트가 끝난 코드들을 통합하는 과정중 생길수 있는 오류를 찾는 테스트 방법

  • 장점 
    1. 코드가 외부 종속성에 어울리는지에 대해 전체 시스템을 구축할 때 오류를 감지할수 있다.
  • 단점
    1. 어느부분이 문제인지 오류를 찾는 것이 어렵다.
    2. 복잡성이 증가하여 시간이 오래 걸릴 수 있으며 유지,관리에도 어려움을 느낄수 잇다.

 

오늘의 느낀점

 

어차피 코드 돌리면 문제가 발생한 지점에 대해 오류 뜰텐데 굳이 왜 테스트 코드까지 돌려야 하나 라고 생각했지만 듀터님의 말씀으로 테스트 코드가 기록되어 있을시 현업에서 일할시 발생되는 문제점에 대해 즉각적인 대응을 할수 있다는 것에 대해 알게됬다.

확실히 어떤 업무는 기준을 정해놓고 작업을 실시하면 흐트려지지 않고 내가 가고자 하는 방향을 갈수 있으며 추후 문제점 발생시 당황하지 않고 처리가 가능하기 때문에 작성을 해두면 큰도움이 될것이라 고 느끼게 됬다.

다만 테스트 코드 만드는것도 나름 일이라서 어려운게 문제다 ㅠㅠ

 

오늘 공부한 내용

  • Spring 심화주차 영상 시청
  • 코드카타 2문제
  • 베이직반 보충수업 / 디스패처 서블릿, CSR, SSR

 

어려웠던 내용

  • 개인 과제 / 테스트 코드 구현
    • 약 2시간 가량 작성하며 고민했으나 진도가 나가지 않음... 테스트코드 자체에 대한 공부 필요

 

새로 알게된점

  • DispatcherServlet

디스패처 서블릿의 dispatch는 "보내다"라는 뜻을 가지고 있다.

그리고 이러한 단어를 포함하는 디스패처 서블릿은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)라고 정의할 수 있습니다.

 

  • 디스패처의 장점

과거에는 모든 서블릿을 URL 매핑을 위해 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리면서 편리하게 사용가능 합니다.

 

  • 디스패처 서블릿의 흐름

  1. 처음 클라이언트에서 요청이 오면 디스패처 서블릿이 해당 요청을 받는다.
  2. Handler Mapping을 통해 요청에 알맞은 컨트롤러를 찾아낸다.
  3. 찾아낸 컨트롤러를 Handler Adapter를 통해 해당 컨트롤러의 메서드를 실행시킨다.
  4. 컨트롤러는 요청을 처리한 뒤 처리한 결과와 해당 뷰 정보(ModelAndView)를 다시 디스패처 서블릿에게 전달한다.
  5. 받은 정보로 디스패처 서블릿은 View Resolver를 통해 View 파일을 찾는다.

 

  • CSR ( Client Side Rendering )

SSR과 달리 렌더링이 클라이언트 쪽에서 일어나는 형식, 서버는 요청을 받으면 클라이언트에 HTML과 JS를 보내준다. 클라이언트는 그것을 받아 렌더링을 시작한다.

  1. 기본적인 HTML구조를 받고 JavaScript가 실행되면서 필요한 데이터를 불러와 화면을 작성.
  2. 서버에 부하가 적습니다.
  3. 네트워크를 많이 사용하기 때문에  첫 진입 시 로딩 속도가 길다.
  4. HTML 파일을 하나만 받아와서 작동하다 보니 각각 페이지에 대한 정보를 담기 힘들어 SEO에 취약.

 

  • SSR ( Server Side Rendering )

서버쪽에서 렌더링 준비를 끝마친 상태로 클라이언트에 전달하는 방식

  1. 모든 HTML을 받아서 렌더링만 하면 됩니다.
  2. 서버에 부하가 많이 갑니다.
  3. 완성된 페이지를 빠르게 볼 수 있습니다.
  4. 초기 진입은 CSR보다 빠를지 몰라도 페이지 이동은 SSR이 더 느린 편에 속함.
  5. Javascript 다운로드가 늦어진다면 기능이 동작하지 않는 경우가 있음.

 

오늘의 느낀점

박성원 튜더님의 보충강의는 정말 이해가 잘간다.

영상을 보면서 의문을 가지거나 혹은 이해가지 않는 개념을 하나하나 세세히 알려주면서 이해를 도와주기 때문에 필수적으로 들으면서 복습에도 좋은 공부가 된다.

+ Recent posts