본문 바로가기

Development42

[이펙티브 자바 정리] 2장 - 객체 생성과 파괴 스터디 메인 페이지 목차 * 책 내용 자체 정리 보다는 제가 각 아이템을 이해한 방식대로 제 생각을 주저리주저리 적는 글 입니다. 따라서 틀린 내용이 있을 수 있습니다. 2장. 객체 생성과 파괴 아이템 1 - 생성자 대신 정적 팩터리 메서드를 고려하라 장점 1 - 이름을 가질 수 있다. 생성자에는 이름을 줄 수 없으므로 실수의 여지가 많다. 또한 생성자에 어떠한 의미를 부여하기도 힘들다. 따라서 정적 팩터리 메소드에 이름을 주면 사용하는 쪽에서도 실수의 여지를 많이 줄일 수 있다. 이하 코드에서 생성자를 통한 생성은 타입 혹은 boolean 처럼 판단 기준을 넘겨줘야 한다. 정적 팩터리 메서드를 사용한게 더 깔끔하고 실수의 여지도 적을 것 같다. new Member("nahwasa", MemberType.. 2023. 2. 17.
스프링부트 3.0이상 Spring Security 기본 세팅 (스프링 시큐리티) 목차 [수정 사항] 2023-03-29 : 커스텀 어노테이션 적용하는 부분에서 소스코드에 잘못 들어간 코드가 있어서 삭제 2024-01-12 : SpringSecurityConfig 클래스의 코드에 어노테이션 빠져 있던 부분 추가 1. 시작하기 전에 1.1 설정 이해 보다는 당장 시큐리티 설정 복붙이 필요한 분들에게 이하 글에서는 import 를 제외하고 작성했고, 코드들이 글에 작성되어 있다보니 완전 초보라면 이해하기 힘들 것 같습니다. 또는 당장 급하게 복붙할 스프링 시큐리티 기본 세팅이 된 프로젝트를 찾는 경우도 있을겁니다. 그러니 우선 예시 프로젝트를 첨부합니다. 이 글은 이하의 예시 프로젝트를 만들기 위해 세팅하는 과정을 다룹니다. - 프로젝트 (스프링부트 3.0.2 기준) : github (m.. 2023. 2. 10.
스프링 부트 2.0에서 3.0 스프링 시큐리티 마이그레이션 (변경점) 목차 스프링 부트 3.0 부터 스프링 시큐리티 6.0.0 이상의 버전이 적용되었습니다. 스프링 부트 2.7.8 까지는 deprecated는 되었더라도 기존 설정대로 대부분 사용 가능했으나, 스프링 부트 3.0 부터는 아예 삭제된 부분들이 있어서 마이그레이션 시 주의할 부분(변경점)에 대해 다룹니다. - 스프링 부트 2.7 이하 스프링 시큐리티 기본 세팅 : 링크 - 스프링 부트 3.0 이상 스프링 시큐리티 기본 세팅 : 작성중 0. 스프링 시큐리티 설정 마이그레이션 예시 완전히 동일한 세팅은 아니지만, 스프링 부트 2.6 기반으로 작성된 기본 세팅 코드와 스프링 부트 3.0 기반으로 작성된 기본 세팅 코드 입니다. 이하에 나올 변경점들이 적용되어 있는걸 코드로 볼 수 있습니다.(각각 위 2.7 이하 기본.. 2023. 2. 9.
자바 날짜 관련 코딩 시 Date와 Calendar를 쓰지 마세요! 결론 : 날짜 관련 코드짤 때 Date, Calendar 쓰지 마세요! Date(jdk 1.0), Calendar(jdk 1.1) 클래스의 문제점 - 불변 객체가 아님. setter가 존재하므로 Calendar나 Date 객체가 여러 객체에서 공유되면 한 곳에서 바꾼 값이 다른 곳에 영향을 미칠 수 있음. - int 상수 필드의 남용. CalendarSECOND 같은 상수 필드때문에, 여기에 Calendar.JUNE 같은 엉뚱한게 들어가도 컴파일 시점에 확인할 방법이 없음. - 헷갈리는 월 지정. Date 클래스에서 1월을 0부터 표현하며, Calendar에서도 마찬가지. 따라서 1582년 10월 4일은 다음과 같이 작성해야 하며 당연히 휴먼에러가 많이 나옴. calendar.set(1582, 9, 4).. 2023. 2. 6.
인텔리제이 JUnit 테스트 리포트 한글 깨짐 해결법 문제 인텔리제이에서 JUnit5를 사용해 테스트 돌릴 시 한글로 설정해둔 DisplayName이 깨져서 나왔다. @DisplayName("생성함") 해결법 1. shift를 두 번 눌러준다. 2. "edit vm" 쳐줘서 저거 눌러준다. 3. 이하의 문구를 추가해준다. -Dfile.encoding=UTF-8 4. 인텔리제이를 껐다킨다. 5. 다시해보면 잘 뜬다. 2022. 12. 15.
스프링부트 3.0.0 프로젝트 생성시 에러 해결법 (인텔리제이) 스터디용 프로젝트 하나 파는김에 새로나온 스프링부트 3.0.0으로 해보려 했다. 그런데 아래와 같은 에러가 발생했다. A problem occurred configuring root project 'java-test-practice'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.0. Required by: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.0 ... 얼핏 스프링부트 3.0.0 변경점 찾아봤던 것에서.. 2022. 12. 15.
개발자 윈도우 세팅 (WSL 서브 리눅스, IntelliJ, vscode, git 등) 목차 0. 이 글의 목표 일반적으로 리눅스에서 IDE를 설치해 개발하기 보다는 윈도우 또는 맥 환경에서 많이 작업한다. 하지만 실제 프로젝트가 올라가는 서버는 리눅스 서버를 많이 사용한다. 또한 리눅스 시스템을 기반으로 만들어진 많은 시스템들이 있으므로 윈도우에서만 개발하기에는 한계가 있고 불편한 점들이 생긴다. 예를들어 윈도우에서만 돌려본 프로젝트가 실제 리눅스 환경에 올렸을 때 100% 정상 동작할지 보장할 수 없다. 이전에 이런 생각을 했었고, 주변 친구들과 인터넷의 여러 글들을 찾아보며 기본이 되는 윈도우 세팅을 구성해두었다. 처음엔 vmware에 맥을 설치해서 해보기도 하고, 리눅스를 가상으로 올려보기도 하고, WSL로 설치한 리눅스에 ubuntu용 intellij를 올린다음 GUI 환경이 없으.. 2022. 7. 24.
인텔리제이 StringTokenizer - NoSuchElementException 문제 해결 방법 (IntelliJ 2022.1.1) 인텔리제이를 현재 기준 가장 최신버전인 2022.1.1로 업데이트 시, StringTokenizer가 정상적으로 동작하지 않는다. 복사-붙여넣기를 하면 동작하지만 직접 작성 시 아래와 같은 에러가 뜬다. 일반적으로 잘 사용하는 클래스는 아니지만, 알고리즘 문제를 푸는 사람들이라면 상당히 난감한 상황이다(인텔리제이 2022.1.1에서만 그렇고, 자바 버전을 변경해도 동일한 것으로 보아 인텔리제이에서 입력받는 로직이 뭔가 변경된 등의 문제가 있는 듯하다.) 원론적인 해결은 못했지만, 방법이 있다. 바로 직전 버전인 2022.1으로 재설치하면 된다. https://www.jetbrains.com/idea/download/other.html Other Versions - IntelliJ IDEA Get past.. 2022. 5. 26.
[토이프로젝트] 죽은 서버 재시작 시켜주는 프로그램 (dead-server-restarter) 토이라고 하기도 뭐한, 단순히 필요에 의해 만들어진 간단한 프로그램이다. 로드밸런서에서 각 서버를 체크하듯이 등록된 서버에서 응답이 있는지 주기적으로 체크한다. 다만 추가로 응답이 없을 시 등록된 sh 또는 bat을 실행해주는 프로그램이다. 물론 안죽는게 가장 좋겠고, 서버 자체를 디버깅해서 안죽게 만드는게 가장 좋겠다. 하지만 이미 새로 만들고 있어 현상유지만 해주면 되거나, 코드를 얻을 수 없는 레거시 코드인 경우엔 새로 만드는 동안 그냥 무지성 재시작이 더 이득일 수 있다. 아무튼 그런 역할이다 ㅋㅋ 일단 1차로 만들어두긴 했는데, 무겁게 만들긴 싫었으므로 그냥 기본 자바로 제작했다. 다만 차후 확장성을 좋게 하기 위해 gradle만 붙였다. 코드는 이하 깃헙 링크에 있다. 설정 및 사용방법도 이하.. 2022. 4. 10.
스프링부트 MyBatis에서 파라미터 여러개 넘기기 (parameterType) 사실 Map 형태로 되어있는 프로젝트라면 모든 Map들을 합쳐서 보내면 되니 별 문제가 없다. 내 경우엔 사용자로 부터 컨트롤러로 들어오는 dto가 여러 종류일 때, 그 종류와 상관없이 동일한 형태로(각 dto에 상응하는 entity를 하나씩 만들고 싶지 않았다) MyBatis에 보내고 싶었다. 또한 해당 요청의 uri도 자동으로 넣어졌으면 좋겠고, JWT+스프링 시큐리티로 AuthenticationPrincipal에 넣어둔 인증된 사용자의 id가 있는 UserInfo도 자동으로 들어가게 하고 싶었다. 즉, 여러 uri를 가지는 컨트롤러들어 있고 각 컨트롤러마다 사용자로부터 받는 dto 클래스가 다르다. 이 때 유저정보, uri, dto를 한꺼번에 물고 MyBatis에 보내고 싶었다. 그래서 다음과 같이.. 2022. 2. 18.