반응형 개발128 [effective java 3/E] equals는 일반 규약을 지켜 재정의하라. equals를 재정의 해야한다면 일반 규약을 지키면서 재정의하자!! equals를 재정의 하지않아도 될 때 아래의 상황 중 하나에 해당한다면 재정의 하지않아도 된다. 각 인스턴스가 본질적으로 고유할 때 논리적 동치성을 검사할일이 없을 때 상위 Class의 equals를 사용해도 문제 없을 때 Class가 private이거나 package-private이고 equals를 사용할일이 없을 때 equals를 재정의 해야할 때 논리적 동치성을 확인 해야하는데 상위 Class의 equals가 논리적 동치성을 비교하도록 재정의 되지 않았을 때 재정의 해야한다. equals를 재정의 할 때 지켜야 할 일반 규약 아래의 사항들을 지켜서 재정의 해야한다. 반사성 : null이 아닌 모든 참조 값 x에 대해, x.equa.. 2020. 7. 5. [Spring] Security를 적용한채로 TEST 해보기 기존에 돌아가던 Test로직에 Spring Security를 입혀보기!! 모든 서비스에는 기본적으로 보안이 들어가야한다. 그래서 Spring Security를 적용해보기로 했다. 아래에는 잘 돌아가던 회원가입 테스트로직이다. 이제 Security를 추가해보자! @Test @DisplayName("회원가입 성공 테스트") void register() throws Exception { MemberDTO memberDTO = MemberDTO.builder() .userId("test") .password("123qwe") .email("test@naver.com") .certification("N") .build(); Set roles = new HashSet(); roles.add(UserRole.USER.. 2020. 6. 28. [effective java 3/E] 자원을 직접 명시하지말고 의존 객체 주입을 사용하라 이게 무슨소리야? 조금 풀어서 말하면 클래스가 내부적으로 하나 이상의 자원에 의존한다면 이 자원들을 직접 만들게 해서는 안된다는 말이다. 그러면 자원은 어떻게 만들지? 라는 의문이 들것이다. 자원을 직접 생성하는것이 아닌 생성자(+ 빌더, 정적 팩토리 메소드)에 넘겨준다. 글로만 보아서는 이해가 어려울수도 있다. (필자가 그랬다...) 그래서 간단한 예제를 만들어 보았다. 시나리오 - 한국어 사전이 있다. - 한국어 맞춤법 검사를 지원한다. 위와같은 시나리오에서 클래스 내부에서 new 연산자를 이용하여 생성한다면 어떻게 코드를 작성하겠는가? 아마도 대부분 아래와 같이 작성할것이다. 한국어 사전.Class public class KoreaLexicon { public KoreaLexicon() { } } .. 2020. 6. 28. [effective java 3/E] private 생성자나 열거타입으로 싱글턴임을 보증하라 싱글톤이란 ? 인스턴스를 오직 하나만 생성할 수 있는 클래스 new 연산자를 이용하여 SingTon 인스턴스를 생성한다면 1개를 만들면 1개 10개를 만들면 10개의 인스턴스가 생성될 것이다. 또한 생성할때마다 메모리에 추가될것이며 모두가 다른 인스턴스일것이다. 반면 싱글톤패턴이란 최초 실행할때 1회만 생성하며 이후부터는 만들어진 객체를 할당하여 사용하는 방식이다. 아래와 같은 SingTon 클래스가 있다고 가정해보자. 생성자를 private 으로 제한하고 유일하게 인스턴스에 접근할 수 있는 수단으로 public static 변수를 하나 생성한다. public class SingleTon { int firstValue = 0; public static final SingleTon SINGLE_TON = .. 2020. 6. 26. [effective java 3/E] 생성자에 매개변수가 많다면 빌더를 고려하라 앞서 소개한 정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기가 힘들다는 점이다. 아래와 같은 클래스가 있다고하자. 필드의 개수가 매우많다. public class ManyFieldClass { private int a; private int b; private int c; private int d; private int e; private int f; private int g; private int h; private int i; private int j; private int k; private int l; private int m; private int n; private int o; private int p; private int q; private i.. 2020. 6. 21. [effective java 3/E] 생성자 대신 정적 팩터리 메서드를 고려해보자 클래스는 생성자와 별도로 정적 팩터리 메소드를 제공할 수 있다. 정적 팩터리 메소드란 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드를 일컫는다. 아래의 CustomBoolean Class 는 자바에 있는 Boolean 에서 설명에 필요한 부분만 발취해서 만든 간단한 클래스이다. 아래의 기본 생성자 CustomBoolean 은 boolean 필드에 값을 세팅해서 새로운 인스턴스를 만들어준다. 정적 메서드 valueOf는 기존에 만들어져있던 CustomBoolean 인스턴스를 반환해준다. public class CustomBoolean { public static final CustomBoolean TRUE = new CustomBoolean(true); public static final Custom.. 2020. 6. 21. [node.js] 작업전에 JWT토큰 검증하기!! JWT란 ? Json 포맷을 이용하여 속성을 저장하는 Claim 기반의 Web Token 토큰 자체를 정보로 사용하는 Self-Contained방식 JWT를 알아보는 게시물이 아니므로 정의정도만 알아보도록 하겠습니다. JWT가 무엇인지 어떤용도로 사용되는지 궁금하신분은 google에 검색하면 많이 나옵니다. 작성할 로직 로그인에 성공하면 JWT토큰을 만들어서 사용자에게 반환한다 요청이 있을때 JWT토큰이 있는지, 있으면 유효한 토큰인지 검사후에 요청을 실행한다. 우선 jwt module이 필요합니다 npm i jsonwebtoken 을 실행해 jwt module을 설치하도록 합니다. 주요로직 설명 jsonwebtoken module을 사용하여 데이터부분, 시크릿키, 만료시간을 설정한다. const jwt.. 2020. 5. 30. [node.js] 페이지 이동 필자는 프론트 프레임워크를 학습하는 시간에 조금이라도 더 백엔드를 공부하고 싶었기때문에 프론트 프레임워크대신 고전적인 html파일로 작성하는 스타일을 선택했다. 여기서 문제가 발생했다. Spring framework는 단순히 js에 href 이벤트를 적어주고 controller에서 경로만 맞춰주면 됐었다. node도 그럴줄 알았으나 node는 추가적인 작업이 필요했다. 긴말 필요없이 하는방법만 적도록하겠다. npm install ejs을 통해서 모듈을 install한다. 일단 폴더구조는 위와같다. src 파일에 있는 app.js에 아래와 같이 설정해준다. router/index.js 파일에서 페이지이동시 사용할 router를 use해주었다. router/page/index.js 에서 page.router.. 2020. 5. 23. [Spring] css파일을 못찾을때 필자는 화면을 만들기 위해 css파일과 html을 만들었다. 그런데 때로는 Failed to load resource: the server responded with a status of 404 () 오류와 because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled. 위와 같은 오류로 css파일을 못찾았다. 원인은 간단하다. 경로를 잘못 적어주었기 때문이다. 아래와 같이 경로를 /css/..... 로 적어주면 정상적으로 불러와준다 2020. 5. 16. [Spring Security] 초기 설정시 403 error가 날때 회원가입을 위한 비밀번호 암호화 기능을 찾다가 간편하게 사용할 수 있는 BCryptPasswordEncoder가 있어서 Security를 알아보게 되었다. SecurityConfig에 모든 요청을 허용하게 설정했다. 나의 예상대로라면 모든 요청을 허용했으니 어떤 요청이던 패스가 되어야한다. /api/users 에 접근하는 테스트코드를 작성하였다. SecurityConfig에는 /api 의 하위에 있는 모든 요청은 허가 되었기때문에 status코드가 200이 떨어져야한다. 하지만 결과는 예상과 다르게 403(권한없음)이 떨어졌다. 이유는 Security를 기본으로 설정하게되면 csrf 설정을 해줘야하기 때문이다. (csrf가 뭔지는 google을 검색해보자) 필자는 가벼운 예제사이트를 만드는것이므로 csr.. 2020. 5. 16. [Spring] 값 검증을 위한 어노테이션 @Valid 필자는 웹사이트를 구축하다가 회원가입을 할때 클라이언트에서 검증해서 넘긴다지만 신뢰성의 문제로 다시 한번 서버에서 검증을 진행하려고 하였다. 이때 파라미터가 1~2개면 상관이없는데 8~9개되면 if문이 8~9개나 들어가게된다. 그래서 무엇이 있을까 알아보다가 @Valid라는 어노테이션이 있다는걸 알게되었다. @Valid를 사용하면 파라미터 바인딩이될때 설정한대로 값검증을 실행하고 문제가 없는경우에만 로직을 수행한다. 사용방법을 알아보기전에 필자의 로직에 대해 설명하겠다. 1. UserDTO를 통해 회원가입에 필요한 정보를 받아올 것이다. 2. 이때 UserDTO를 @Valid로 검증할것이다 3. 올바르게 가져왔다면 User 객체로 ModelMapper를 사용하여 변환해줄것이다. 4. 문제가 없다면 상태코.. 2020. 5. 15. [Spring data JPA] Auditing으로 생성일/수정일 간편하게 생성하기! 개인프로젝트에서는 생성일/수정일을 몰라도 크게 상관없겠지만 실무에서는 생성일/수정일을 필수로 가지고 있어야 하는경우가 많다. 언제 생성됐는지, 언제 변경되었는지는 거의 모든 테이블에 있어야한다. 추가로 생성을 누가했고 수정은 누가했는지도 필요한 테이블도 있다. 이 경우에 모든 Entity에 생성일필드와 수정일 필드가 공통적으로 들어간다. 이러한 공통적인것을 추상클래스를 이용하여 설정하는 방법이 있다. 바로 Auditing이다. 사용법은 아래와 같다. BaseEntity를 다음과 같이 설정한다. @EntityListeners 어노테이션을 사용하여 Auditing기능을 추가한다. 그리고 생성일/수정일을 사용할 Entity에서 BaseEntity를 상속받는다. 이렇게 하면 끝!!이면 좋겠지만 실행하는곳에서 @.. 2020. 5. 10. 이전 1 ··· 3 4 5 6 7 8 9 ··· 11 다음