오늘 공부한 내용

  • Spring 입문주차 1주차, 2주차 영상 재시청
    • CRUD, JPA 위주로 공부
  • 코드카타 2문제

어려웠던 내용

  •  CRUD 작성 , JPA 작성

 

 

 

 

오늘의 느낀점

 오늘은 과제 작성을 위하여 복습하는 날로 정하고 미숙한 CRUD 작성과, JPA작성에 중점을 두고 영상을 시청하며 따라치는 연습을했다.
내용을 보지 않고 직접 CRUD를 머리속으로 구상하면서 칠수있는 날이 오기까지 시간날때마다 반복적으로 치는 연습을 가져서 숙달해야 이후 개발자로서 한사람몫을 하게 될거 같다.
 

 

오늘 공부한 내용

  • Spring 숙련주차 2주차 시청 
  • 숙련주차 2주차 과제수행

 

어려웠던 내용

  • 숙련주차 2주차 과제 수행

어노테이션 적용후 Dto 연결이 어렵다.

새로 알게된점

1. Validation

Validation 이란 어떤 데이터 (주로 사용자 또는 다른 서버의 request)의 값이 유효한지, 잘못된 내용이 있는지 확인하는 단계를 뜻합니다. 예를들어 이메일 주소의 양식은 "email@email.com"의 양식어어야 하는데, 이 양식과 일치하지 않는 값이 들어온다면 해당 값의 저장을 막을 수 있습니다.

 

  • Java Bean Validation

스프링 부트에서는 gradle에 의존성 하나만 추가해주면 간단하게 사용할 수 있습니다.

implementation("org.springframework.boot:spring-boot-starter-validation")

JavaBean 기반으로 간편하게 개별 데이터를 검증할 수 있으며, JavaBean내에 어노테이션으로 검증방법을 명시하면 됩니다. 

Validation의 주요 어노테이션

  • Validation 예외처리

회원가입 진행 시 데이터 검증 시 오류가 발생했을 때 로그인 페이지가 아니라 회원가입 페이지로 이동 하려면 Validation 예외를 처리해야합니다.

예시로 SignupRequestDto에 들어있는 내용에 제한을 가져 보자

기존에 적혀 있는 SignupRequestDto 내용이다.

@Getter
@Setter
public class SignupRequestDto {
    private String username;
    private String password;
    private String email;
    private boolean admin = false;
    private String adminToken = "";
}

 

 

여기서 각각의 내용에 제한을 걸려면 위에 어노테이션을 이용하여 적어준다.

@Getter
@Setter
public class SignupRequestDto {
    @NotBlank(message = "공백X") //빈값 + 공백만 있는 경우를 허용하지 않는다.
    private String username;
    
    @Pattern(regexp = "^[a-zA-Z0-9]") // 소문자 a에서 z까지, 대문자 A에서 Z까지, 0~9의 순자만 사용할수있다.
    private String password;
    
    @Pattern(regexp = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$") 
    // 위와 동일하게 적용되며 특수문자(!#$%&'*+/=?`{|}~^.-)도 사용할수있다.
    @NotBlank
    @NotNull //null을 허용하지 않는다.
    private String email;
    private boolean admin = false;
    private String adminToken = "";
}

 

 

오늘의 느낀점

오늘 부터 실질적인 과제작성에 들어갔다. 다만 막상 시작하려고 하니 어디서부터 건드려야 할지 모르겠고 진도가 안나가서 결국 영상을 다시 보게 된다.

회원가입 기능, 할일 카드, 댓글 구현 총 3가지의 기능을 주축으로 만들어야 하는데 메모할때 와 다르게 막상 만들려고 하니 어떻게 응용해야 할지를 모르겠다.

영상을 보면서 모르는 부분도 많지만 그래도 어느부분부분은 하나하나 익힐수 있는 구조가 되어서 도움이 된다만 기초공부를 다시 해야 할거 같다.

오늘 공부한 내용

  • Spring 숙련주차 1주차 시청 
  • Spring Security 로그인, 접근불가 처리
  • 코드카타 문제 풀기

어려웠던 내용

  •  Spring Security JWT

초기 가르쳐줄때 인증, 인가 만 하던 처리 하던것에서 토큰을 가져와서 적용하는 부분으로 수정할때 이해가 어렵다.

 

 

새로 알게된점

  • API 접근 권한 제어 이해

페이지 접속시 관리자를 제외한 회원들을 관리자 페이지에 접속 하지 못하게 하기위해서 회원 상세정보 (UserDetailsImpl)에 권한(Authority) 설정하여 특정 권한을 가지지 못하게 하는자를 API를 통해 못들어오게 할 수 있다.

 

  • 자릿수 더하기
문제 설명

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

 
제한사항
N의 범위 : 100,000,000 이하의 자연수
 

입출력 예

N answer
123 6
987 24
입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.

 

*원래 문제의 의도대로 숫자에서 각각의 백의 자리, 십의 자리, 일의 자리를 더하는 방식으로 정수 N을 문자 String 방식으로 바꾸었으나 각각 따로 합치는 방법을 찾지 못했다. 그래서 while문을 사용해서 정수를 10씩 나누어 일의자리를 더하는 방식으로 만들었다.

public class Solution {
	public int solution(int n) {
		int answer = 0;
		
		while (n > 0) {
			answer += n % 10; // 일의 자리부터 자릿수 더하기
			n /= 10;
		}
		return answer;
	}
}

이렇게 할 경우 입력한 값에서 answer += n % 10; 통해 나머지 값을 따로 빼낸후 입력값을 10으로 나누어 나머지를 없애는 int형 정수로 만든다음 다시 answer += n % 10; 통해 나머지 값을 따로 빼내는 형식의 while문으로 처리된면서 빼낸값들을 합치는 방식으로 처리한다.

만약 입력한 값이 135 라면 135%10 = 5 이며

answer += 5 인 셈이다

135 -> 5

13 -> 3

1 -> 1

5+3+1 = 9 를 쉽게 구할 수 있다.

 

이후 처음 의도대로 하는 방법을 찾아보다가 코드를 찾았는데

class Solution {
    public int solution(int n) {
        int answer = 0;
        String a = Integer.toString(n);
        
        for(int i = 0; i < a.length(); i++){
            answer += Integer.parseInt(a.substring(i, i + 1));
        }
        return answer;
    }
}

해당 코드에서는 parseInt를 이용했었다.

분명 처음 배울때 parseInt에 대해 배우긴 했지만 실제로 이렇게 이용하는거는 처음봐서 굉장히 신기 했다.

 

 

 

오늘의 느낀점

코드 카타를 풀고 다른사람들의 풀이를 보면서 정말 다양한 방법들이 있다는것을 알게 된다.

코드를 쉽게 적거나, 읽기좋게 만들거나, 효율을 올리는등 정말 다양하게 적혀 있는걸 보면서 좀더 생각의 틀을 넓혀야 겠다는 생각을 느꼈다.

오늘 공부한 내용

  • Spring 숙련주차 1주차 시청 
  •  

어려웠던 내용

1.  필터, 'Spring Security' 프레임 워크

 

새로 알게된점

1. 필터의 사용 이유

필터란 무엇인가?

HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 코드이며 Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치이며 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있습니다.  

필터는 객체의 형태로 존재하며 옆에 그림에 보이는 것처럼 클라이언트로부터 오는 요청(request)을 받아 최종자원(서블릿/JSP/기타 문서)을 거쳐 클라이언트의 요청 정보를 알맞게 변경한 후 다시 필터를거쳐  최종 자원과 클라이언트로 가는 응답(response)를 제공한다.

 

 

 

 

오늘의 느낀점

처음에 필터를 배울때 이런 방식을 왜쓰나 했는데 이후 Spring Security를 배우면서 내가 사용하는 페이지에서 재접속시 이미 다시 로그인하는 번거로움을 없애기위해 필수적인 구조라는 것을 깨닫고 웹구조는 사람의 편의를 위해서 정말 많은 수정을 겪어왔다는 것을 느꼈다.

점점더 배울수록 어렵고 이해가 안되서 혼자 끙끙대면서 머리를 싸매지만 영상에서 알려준 내용의 구조와 설명을 듣고 평소 내가 사용했던것이 이렇게 만들어졌구나라는것을 보고 느끼면서 신기하면서도 조금씩 재미를 느껴가는거 같다.

 

 

 

오늘 공부한 내용

  • Spring 숙련주차 1주차 시청 
  •  

어려웠던 내용

1.  JWT다루기

 

새로 알게된점

1. JWT를 사용하는 이유

수많은 클라이언트들의 데이터를 저장하기 위해서는 다량의 서버가 필요하며 이 다수의 서버를 운용하기 위해서 Session Storage가 필요한데 카카오 같은 동시접속자가 많은 경우에는 서버측 부하를 낮추기 위해서 Session Stroage가 아닌 JWT를 사용한다.

왜냐하면 Session Strorage는 모든 클라이언트의 로그인 정보 소유하고 있기때문인데 클라이언트가 서버를 거쳐서 Session Strorage로 로그인정보를 요청하는 과정을 가지는데 JWT는 로그인 정보를 Server 에 저장하지 않고, 클라이언트 에 로그인 정보를 JWT 로 암호화하여 저장하도록 하여 서버를 거치기 않고 클라이언트 정보를 가져오기 때문이다.

Session Storage를 사용하여 로그인시 클라이언트에서 서버를 거쳐 Session Storage로 향한후 다시 돌아오는 모습
JWT 사용시 클라이언트에게 JWT를 부여하여 로그인시 클라이언트가 서버에 부여된 JWT와 동일할시 접속할수 있는모습

 

오늘의 느낀점

JWT 구조를 보면서 확실히 서버에 접속하는데 부하를 줄일수있지만 보안에 취약하다는것을 보고 제대로 관리 못하면 해킹당할 가능성이 높겠다라고 생각이 들었다.

각각의 구조에 따라 장단점이 있으며 가성비에 따라 혹은 운영방침에따라 데이터 관리가 달라지겠다는 생각도 같이 들면서 추후 백엔드 개발자로 일할때 큰 참고가 될것 같다.

오늘 공부한 내용

  • Spring 숙련주차 1주차 시청 
  • 개인과제 확인
  • Spring 입문주차 2추가 재시청

어려웠던 내용

1. 인증과 인가

- 인증의 구조 방식

 

새로 알게된점

1. Bean 수동 등록 과 같은 타입의 Bean이 2개이상 일 경우 처리

  • Bean 수동등록

Bean으로 등록하고자 하는 객체를 반환하는메서드 위에 @Bean 을 추가하면 되는데 이후 이 Bean을 등록하는 메서드가 속해있는 해당 Class 위데하가 @Configuration 을 추가하면 된다. 

@Configuration
public class PasswordConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

 

  • Bean이 2개이상 일 경우 

3가지의 방법이 있으며

등록된 Bean 이름을 명시하여 사용하는 방법

@Primary 를 Bean 위에 추가하여 해당 Bean을 우선순위를 주는방법

@Qualifier 를 Bean 위에 추가하고 주입하고자 하는 필드에도 @Qualifier("Bean이름") 을 추가하는 방법

구성된다.

 

* @Primary, @Qualifier는 Bean에 우선순위를 적용하는 것이며 @Qualifier가 우선순위가 더 높다

 

 

 

 

2. 인증과 인가의 차이점

  • 인증(Authentication)
    • 인증은 해당 유저가 실제 유저인지 인증하는 개념입니다.
    • 여러분의 스마트폰에 지문인식, 이용하는 사이트에 로그인 등과 같이, 실제 그 유저가 맞는지를 확인하는 절차 입니다.
  • 인가(Authorization)
    • 인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념입니다. 예를들어 관리자 페이지-관리자 권한 같은 것들을 들 수 있습니다.

 

 

오늘의 느낀점

오늘 스프링 입문주차 2주차 내용을 다시 시청하면서 공부하는데 위주로 했다.

JPA와 Entity에 대해 많이 미숙하다보니 더 더욱 신경 써야 할거 같다.

스프링 숙련주차 내용 초반부분은 개념 부분이라 어렵지는 않는데 이후 점점 어려워 질거같다.

오늘 공부한 내용

  • Spring 입문주차 2주차 시청 
  • 코딩테스트 문제풀기

어려웠던 내용

1. Query Methods

 

 

새로 알게된점

1. Query Methods

- JPA의 Repository 인터페이스에서 지원되며, 메소드 이름을 분석하여 쿼리를 자동으로 생성함.

데이터베이스에 있는 자료에서 데이터를 순차적 정렬을 하거나 원하는 정보 데이터만 찾고 싶을때 Repository 에서 메서드 이름으로 쿼리를 생성하여 사용한다.

public interface MemoRepository extends JpaRepository<Memo, Long> {
    List<Memo> findAllByOrderByModifiedAtDesc();
    List<Memo> findAllByContentsContainsOrderByModifiedAtDesc(String keyword);
}

위에 예시의 코드 의미는 List<Memo> 안에 들어있는 자료중 find...By로 조회를 select한후 안에All 넣어 모든 범위를 대상으로 한다 이후 OrderBy는 순서정렬에 대한 내용이며 ModifiedAt이라는 필드데이터를 의미, Desc는 내림차순을 말한다.

즉 ModifiedAt이라는 필드데이터를 기준으로  정렬(OrderBy) 해서 전체데이터를 내보낼건데(findAllBy) 이를 내림차순(Desc)으로 할것입니다.

 

밑에 추가 예시는 꼭 자료전체 뿐아니라 뒤에 keyword를 넣어서 특정 단어가 들어가 있는 데이터를 찾게 하도록 하는 것도 가능하다.

 

오늘의 느낀점

하나의 프로젝트를 완성하기 위해서 적용해야 할 기술이 정말 많은거 같다.

간단하면서 편리하게 사용하기 위해 만든 기술이지만 이해를 못하면 오히려 더 어렵게 느껴지고 헷갈려 구분이 안가게 된다.

이번에도 한가지 기능을 이해하기위해서 부수적인 것을 찾으면서 적용하다보면 점점 더 알아야 할게 많아지다보니 JPA를 공부하면서 정말 공부해야할 것이 많다는것을 새삼 깨닫게 됬다.

 

오늘 공부한 내용

  • Spring 입문주차 2주차 시청 
  • 베이직반 특강 / 데이터 베이스와 ORM
  • 코딩테스트 문제풀기

어려웠던 내용

1. SpringBoot의 JPA

 

 

새로 알게된점

1. 베이직반 특강

- 데이터베이스 스키마 설계 : 기존 영상강의에서 설명이 이해가 안가던 중간중간 단어들에 대해서 정확하게 할게되었다.

- 스키마 : 데이터베이스의 구조를 정의하는 틀

- 테이블 : 관계형 데이터베이스가 데이터를 저장하는 구조

- 열(Column)과 행(Row) : 테이블 안에 저장되는 데이터의 형식

  • 열은 데이터베이스의 필드를 나타내며, 각 열은 해당 데이터 유형의 속성을 지님
  • 행은 실제 데이터가 저장되는 곳이며, 데이터베이스에서 하나의 '레코드'가 됨

2. 코딩테스트

- 두 수의 차, 두 수의 곱, 몫 구하기, 나이출력  / 4문제 해결

- 내가 작성한 코드가 정답은 아니며 나보다 더 효율좋은 코드들이 있다.

  •  

  

오늘의 느낀점

특강을 들으며 처음 스프링 2주차 강의를 들으며 영상이나 자료에서 다소 엉성하게 넘어갔던 부분에 대해서 듀터님이 세세하게 설명하며 개념을 확실하게 다잡았다.

시간에 쫓겨서 다소 이해못해도 다음강의후 넘어가다보니 후반부에 들어서 더욱더 이해가 안됬는데 초반 개념에대해 자세히 알려주시기 이제는 이게 왜이랬는지 얼추 이해가 된다.

코딩테스트에 대해서 처음 알게되었고 오늘 4문제를 풀었다.

난이도도 낮고 Java초반 개념은 잡혀있어서 금방 풀겠지 했는데 막상 해보니 적잖은 시간이 걸렸으며 끝나고 다른사람 풀이까지 확인해보니 더욱 정확하며 간편한 코드들이 다양한 모습으로 있는걸 확인했다.

앞으로도 지속적으로 문제를 풀어나가면 도움이 될거 같다.

오늘 공부한 내용

  • Spring 입문주차 2주차 시청 
  • 알고리즘 특강

어려웠던 내용

1. Entity에 대한 이해

- DB를 보다 쉽게 다루기 위하여 사용되는 JPA에서 관리되는 객체를 의미

- 하지만 실제 코드를 보면서 따라해봐도 뭐가뭔지 잘 모르겠다.

2. 영속성 컨텍스트

-  Entity 객체들이 저장된 공간을 의미

 

새로 알게된점

1. 포인터 / C 언어

포인터란 변수의 메모리 공간의 주소를 가리키는 변수 이다.

변수명 앞에 *를 붙이면 된다.

✔️ 포인터 변수 선언

int a = 123;
int *p = &a; // &a 는 int a의 주소값
  • 주소 연산자(&)는 변수의 이름앞에 사용하여, 해당변수의 주소 값을 반환하며 변수 a에 &를 붙힘으로 a의 주소값을 의미
  • int *p = &a; 처럼 선언할 때에는 변수명(p) 앞에 *를 붙혀서 포인터 변수임을 명시
  • 선언한 이후에 *p라고 쓰게 되면, 포인터 변수 p가 가리키는 주소의 값을 의미. 즉 123가 된다
  • 즉 a 와 *p는 같다. (a에 저장된 값 = 123, * p가 가리킨 주소에 있는것 = 123)
  • &a 와 p는 같다. (a의 주소 값 = 10000, p가 가리키는 주소 = 10000)

중요 ! 자바에는 왜 포인터가 없을까?

  • 자바에는 참조(Reference)가 있기 때문
  • 포인터 vs 참조
    • 포인터: 메모리를 직접 핸들링 할 수 있음
    • 참조: 메모리를 직접 핸들링할 수 없음
  • 포인터는 주소값을 임의로 변경가능하며 유연성과 성능을 향상시킬수 있지만 안정성이 떨어져 개발자가 실수하면 바로 에거로 이어질 수 있다. Java에서는 개발자의 실수를 방지하기 위해 자바가 메모리 영역을 관리한다.
  • GC(Garbage Collector)가 실행될 때 마다 Heap 영역의 객체의 주소가 계속 바뀌기 때문 (자바가 관리)
    • 더이상 stack에서 참조되지 않는 Heap 영역의 객체들은 GC가 제거

  

오늘의 느낀점

금일 특강에서는 알고리즘 처리방법, C언어에 대한 간단한 설명 을 해주었는데 현업에서도 자바 뿐만 아니라 컴퓨터의 근본이었던 C언어에 파이썬 등 다양한 언어까지 사용되니 개발자는 끊임없이 공부를 해야한다는 튜더님의 말씀을 들으며 참 갈길이 멀구나라는걸 느꼈다.

자바도 어렵게 느껴지는데 C언어는 정말 복잡한 구조였겠구나라고 생각이 든다.

그래도 나중에 따로 공부해 봐야지...

 

오늘 공부한 내용

  • Spring 입문주차 2주차 시청 
  •  

어려웠던 내용

1. Controller - Service - Repository 분리하기

- 분리과정이 잘 이해가 안된다.

2. IOC와 DI

- IOC컨테이너에서 직접 Bean을 가져오는 경우가 어렵다.

 

새로 알게된점

1.  업무의 세분화를 위하여 크게 Controller - Service - Repository 형태로 구분하니 확실히 코드가 깔끔해지고 가독성이 높아졌다.

 

 

오늘의 느낀점

기존 영상에서 만들던 메모장 프로젝트에서 하나의 클래스에서 3구분으로 나누어서 처리하는걸 보니 확실히 이렇게하면 추후 다른사람이 코드확인이 편리하다는걸 느낄수 있었다.

또 IOC에서 그동안 선배님들의 스프링프레임워크의 지속적인 개량으로 대부분을 자동적으로 Bean처리하여 코드작성에 편리함을 더해준다는것을 알았지만 영상에서 말한대로 오히려 편리함떄문에 이게 왜 들어가고 적용되는지 이해가 안된다. ㅠㅠ

+ Recent posts