전체 글(11)
-
2단계 인증은 왜 사용하는 걸까?
평소 여러 서비스를 사용하다 보면 2단계 인증을 진행하라는 문구를 자주 볼 수 있다. 이때마다 귀찮게 핸드폰이나 이메일을 통한 2단계 인증을 해야 한다. 왜 그런 것일까? 어차피 뚫릴 수 있는 보안 결론부터 말하자면 어떤 방식으로 보안을 강화하든 로그인 정보는 탈취당할 수 있기 때문이다. 왜 그런지 알기 위해선 로그인을 유지하는 방법을 알아야 한다. 로그인 유지에는 대표적으로 session과 JWT(json web token)를 많이 쓴다. session session은 서버에 session 정보를 저장하고 클라이언트의 cookie에 session의 id 값을 저장한다. JWT - json web token jwt는 session과 비슷하며 다르다. JWT의 구조는 아래와 같다 Header는 토큰의 타입..
2023.07.06 -
Dart - const와 final의 차이는?
dart엔 const와 final이 있다. 흔히 js에서 보이는 상수 const, java에서 보이는 상수 final인데 다트에선 이걸 둘 다 쓰는 이유가 뭘까? 그걸 알기 위해선 일단 const와 final의 차이점을 알아야 한다. const는 컴파일 단계의 상수 final은 런타임 단계의 상수 이다. 쉽게 말하자면 final은 api의 값을 할당한다든지 하는 런타임에서 가변적으로 들어오는 값을 상수로 할당할 수 있다. const는 하드코딩을 할 때와 같이 코드 상에서 부터 값을 불변하게 적어 놓는 것을 상수로 할당할 수 있다. ex) const a = 13; // 가능 const a; // 불가능 final b = 13; //가능 final b; // 일부 상황에서 가능 class Human { //..
2023.02.12 -
Dart - 다트의 생성자엔 왜 late를 쓰지 않는 걸까?
앱 기반 서비스를 위해 플러터를 배워야 해서 다트 공부부터 시작했다. 근데 자바와 언듯 닮은 느낌이 들었다. 근데 생성자 부분에서 late 를 쓰지 않는 것이다! JAVA로 따지면 필드에 private String name; 이 안되는 건데 그럼 어떻게 하냐? class Player { final String name = 'jisoung'; final int age = 17; Player(String name, int age); void sayName() { print("Hi my name is $name"); } } 위와 같이 코드를 짜게 된다. late 는 결국 init을 바로 할 필요 없게 설정하는 것이다. 즉 late가 없을 땐 생성과 동시에 값이 있어야 하는 것이다. 하지만 Class는 인스턴스..
2023.02.10 -
[Spring-test] json to object - 복잡한 json string을 DTO로 변환하기
테스트 코드 작성 중 게시글의 내용을 검증해야 하는 상황이 발생했습니다. 이때 controller단에서 mvc로 테스트 중이었으므로 return 해서 들어오는 json string을 DTO로 파싱 해서 써야 했습니다. 근데 파싱을 하려니 데이터 구조가 비교적 복잡(?)해서 포스트만을 보고 해결하기가 어려웠습니다. public class Like { private Long id; private String bookName; private String bookCategory; private String[] writer; } 보통의 포스트들은 구조가 위와 같이 단순한 경우에서 objectMapper를 사용한 경우가 대부분이었습니다. 그때부터 복잡한 json 파싱 하기 이런 식으로 다르게 검색해 봤습니다. 사실..
2023.01.27 -
[Spring-security-test] MVC test 401/403 에러
프로젝트를 진행하며 controller 단의 테스트 코드를 작성하던 도중 403 에러가 발생했습니다. 약 3일간 검색과 적용을 반복했지만 403은 사라지지 않았습니다. 결론은 삽질이긴 했습니다. 이후 나 같은 사람이 적어지길 바라며 글을 작성해보겠습니다. 1. 401 에러 401 에러는 Unauthorized로 로그인을 하지 않아 나는 에러입니다. 403과 언 듯 비슷해 보일 수 있으나 403은 로그인 후 권한 부족, 401은 로그인 자체에 대한 에러입니다. 즉 401은 테스트 계정이 없다는 의미입니다. 이를 해결하는 방법은 간단합니다. @WithMockUser @WithAnonymousUser (미인증 사용자) @WithUserDetails (메서드가 principal내부 값을 직접 사용할 경우) @W..
2023.01.25 -
[JAVA] Stream과 List는 무슨 차이가 있을 까?
김영한 님의 강의를 보다가 stream()을 쓰고 난 후에 foreach나 map과 같은 함수를 쓰는 것을 보았습니다. 조금 이상했죠, List타입도 Collection을 상속받으니까 foreach나 map을 쓸 수 있을 텐데 왜 굳이 stream을 한번 더 끼는 거지? 약간 이해가 잘 안 갔습니다. 뭐 제가 아직 잘 몰랐으니까 그럴 수 있죠. 그래서 stream을 했을 때와 안 했을 때의 성능 비교 및 List(이하 컬랙션)와 stream의 차이점을 알아볼 겁니다. 먼저 차이점 입니다. 스트림과 리스트의 차이점을 정리하자면 스트림은 - 원본 데이터의 수정이 없음 - 데이터 처리를 주목적으로 하는 인터페이스를 제공함 - 저장공간을 독립적으로 갖지 않음 - 거의 무한함 - 간결함 - Lazy 베이스 구현 ..
2022.10.11