오늘 공부한 내용

  • Spring 숙련주차 1주차 영상 재시청
  • Spring 숙련주차 1주차 과제 해석영상 공부
  • 코드카타 2문제

 

어려웠던 내용

  •  회원가입을 위한 JWT 구조작성

 

새로 알게된점

  • Integer.parseInt() //  문자를 정수로 바꾸는 함수

먼저 이것에 대해 알게된 것은 코드 카타를 하던중이다. 해당문제는 

문자열을 정수로 바꾸기

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

제한 조건

  • s의 길이는 1 이상 5이하입니다.
  • s의 맨앞에는 부호(+, -)가 올 수 있습니다.
  • s는 부호와 숫자로만 이루어져있습니다.
  • s는 0으로 시작하지 않습니다.

입출력 예

예를들어 str이 1234이면 1234를 반환하고, -1234이면 -1234를 반환하면 됩니다. str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.

메서드는 일부 문자열을 입력으로 받고 필요한 정보를 "추출"하여 호출 클래스의 객체로 변환합니다.

 

숫자를 문자형태로 바꾸는 toString에 대해서는 알고 잇었지만 문자를 숫자로 바꾸는 메서드는 알지를 못했다.

이후 답을 찾아보았는데 굉장히 간단한 코드여서 맥이 빠졌다.

class Solution {
    public int solution(String s) {
        int answer = Integer.parseInt(s);
        return answer;
    }
}

위와 같이 문자형태인 n을 바꾸고자하는 정수형태로 바꾸기 위해서

Integer.parseInt(s) 형태처럼 앞에 래퍼클래쓰를 적은후 parse뒤에 자료형 을 적으면 된다.

즉 int 뿐만 아니라 byte, short, long, float, double 등 정수 와 관련된 타입은 전부 가능하다.

그리고 int로 숫자를 바꿀시 기본적으로 십진법을 적용하며 만약 원한다면 8진수, 16진수 를 적용하여 바꿀수도 있다.

 

방법은 Integer.parseInt(String s, int radix) 형태로 코드를 적는 것이며 여기서 숫자형의 문자열을 첫번째 인자 값 (String s) 으로 받고 변환할 진수값 (int radix)을 입력하면 해당 진수에 맞춰 Integer 형으로 변환된다.

class Javaparse {
    public static void main(String args[]){
           int x = Integer.parseInt("12");
           double c = Double.parseDouble("12");
           int b = Integer.parseInt("100",2);

           System.out.println(Integer.parseInt("12"));
           System.out.println(Double.parseDouble("12"));
           System.out.println(Integer.parseInt("100",2));
           System.out.println(Integer.parseInt("101", 8));
   }
}

이것에 대한 출력값으로

 12 
 12.0 
 4 
 65

이렇게 출력되는것을 확인 할 수 있다.

 

오늘의 느낀점

 간단한 코드카타 라고 볼수 있겠지만 정말 많은 형태의 메서트가 있다는걸 알게됬다.
알고리즘을 더 잘풀기위해서는 더욱더 많은 문제를 접해서 다양한 메서드를 겪어봐야 실력이 향상이 될거 같다.

오늘 공부한 내용

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

어려웠던 내용

  •  CRUD 작성 , JPA 작성

 

 

 

 

오늘의 느낀점

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

 

오늘 공부한 내용

  • Spring 숙련주차 2주차 과제 제출
  • Spring 숙련주차 2주차 과제 해석영상 공부

 

어려웠던 내용

  •  과제를 수행하기 위한 전체적인 구조 이해

 

새로 알게된점

1. Password Encoder (비밀번호 암호화)

비밀번호를 저장할 때, 일반 플레인 텍스트를 데이터베이스에 저장하면 안된다. DBA나 해커가 고객 데이터베이스에 접근한다면, 비밀번호를 볼 수 있기 때문이다. 따라서 비밀번호는 암호화 과정을 거쳐 데이터베이스에 저장하는 것이 바람직하다.

그중 PasswordEncoder는 비밀번호 암호화 고정중 단순히 해시는 하는것 뿐만 아니라, salt(바이트 단위의 임의의 문자열) 를 추가하기 때문에 입력값이 다르더라도 encode하는 경우 암호화된 결과값이 항상 다르게 나온다. 

 

PasswordEncoder를 사용함에 앞서 Spring Security 의존성을 주입해줘야 한다.

이를 위해 프로젝트 우측에 Gradle 설정에서 위코드를 dependencies안에 적어준다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
}

 

 

이후 패스워드를 userRequestDto에서 바로 가져오는것이 아닌 passwordEncoder를 통해 가져오기 위해 

String password = passwordEncoder.encode(userRequestDto.getPassword()); 형식으로 적어준다

@Service
@RequiredArgsConstructor
public class UserService {
    private final PasswordEncoder passwordEncoder;

    public void signup(UserRequestDto userRequestDto) {
        String username = userRequestDto.getUsername();
        String password = passwordEncoder.encode(userRequestDto.getPassword());
    }
}

 

PasswordEncoder는 기본적으로 BCrypt 방식을 많이 사용이 되는데 이를 Bean으로 등록해야 사용할수있는데 그 이유는 Spring Security에서 제공하는 PasswordEncoder는 인터페이스이기 때문에 아래와 같이 구현체를 빈으로 등록해야 사용할 수 있다.

Bean을 주입해서 사용할것이기에 따로 config 클래쓰를 만들어서 @Configuration 어노테이션 적용후 config로 활용하며 여기 안에 적도록 한다.

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

이를 통해 @Configuration 안에서 Bean으로 선언해줌으로써 실제 기본으로 떠있는 Bean에 BCryptPasswordEncoder의 Bean으로 오버라이딩이 가능해진다.

 

오늘의 느낀점

오늘 과제 해석을 보면서 코드를 반복적으로 치는 연습을하면서 코드가 각각 어디에 적용되는지에 대해서 공부하는 것을 중점으로 하였다.

결국 과제는 미완성으로 제출하게 되었지만 금일 해석영상을 보고 작성하면서 다시 하나씩 복습하면서 12월 끝나기전까지는 내손으로 직접 만들어보는것을 목표로 차분히 익혀나가야겠다.

오늘 공부한 내용

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

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

+ Recent posts