본문 바로가기

반응형

개발

(48)
swagger 도입 (T-001) T-001 프로젝트는 단기간에 완성을 해야하는 관계로 프론트까지 개발할 여력이 없습니다... 따라서 swagger를 도입하여 브라우저 단에서의 api 테스트를 해결하기로 결정하고 도입하였습니다 io.springfox springfox-boot-starter 3.0.0 위처럼 스타터 디펜던시를 추가해주면 되어 간편합니다 별도의 설정 없이 바로 swagger에서 제공해주는 api로 접속이 가능합니다 하지만... csrf에 막혀 post 메소드가 전부 리젝되는 문제가 발생합니다 이를 해결하기 위해 아래와 같은 class 하나를 제작합니다 public class CsrfRequireMatcher implements RequestMatcher { private static final Pattern ALLOWED_..
validation 구현하기 - 3 (T-001) 주의 이 시리즈는 일주일 조금 넘는 기간 동안 블로그 주인이 밤새 작업하면서 쓰는 글입니다 정확하지 않은 내용이 포함 될 수 있고, 끝내지 못 할 수 있습니다 이전 포스팅에서는 직접 제작한 폼 객체에 어노테이션을 활용하여 validation을 구현하였습니다 이후 컨트롤러에서 파라미터로 해당 객체로 데이터를 받을 때, @valid 등의 어노테이션을 활용하여 validate이 동작해야 하지만 그렇지 않는 상황입니다... 현재 상황 파악 중 입니다... 2/22일 현재 정상적으로 동작하는 것을 swagger를 통해 확인하였습니다 단위 테스트에서 정상적으로 동작하는지 다시한번 확인해보고 상태를 업데이트 하겠습니다
isassignablefrom vs instance (T-001) 하이버네이트 TypeDescritor를 제작할 때 특이했던 부분이라 이렇게 포스팅합니다 TypeDescritor에서 unwrap시에는 isassignablefrom을 사용하고, wrap할때는 instance를 이용합니다(예시) 이때 unwrap은 자바 객체를 데이터로 변활 할 때 사용되고, wrap은 그 반대의 경우 사용됩니다 인터넷 서칭 결과 instance는 컴파일 타임에, isassignablefrom은 런타임에 동적으로 사용 될 수 있다고 합니다 아무튼 예시의 소스코드에서는 메소드 파라미터로 class를 받는지, 아닌지에 따라 용도를 구분하는 것 처럼 보였습니다 하지만... 까짓거 뭐 레포지토리에 save 한번 호출해서 객체를 데이터로 매핑 한번 해주고, find 한번 호출해서 데이터를 객체로 매..
validation 기능 구현 - 1 (T-001) 주의 이 시리즈는 일주일 조금 넘는 기간 동안 블로그 주인이 밤새 작업하면서 쓰는 글입니다 정확하지 않은 내용이 포함 될 수 있고, 끝내지 못 할 수 있습니다 프론트쪽에서 입력한 폼정보가 백엔드로 넘어 왔을 때, 우리는 특정한 객체에 해당 정보를 담아 받아 볼 수 있습니다 이때 사용하는 객체를 커맨드 객체라 부르고 이번 시리즈에서는 이 커맨드 객체를 validation해보도록 하겠습니다 아래와 같은 작업을 진행하면 쉽게 문제를 해결 할 수 있습니다 1. 커맨드 객체를 제작 2. 해당 커맨드 객체를 validate할 validator 객체를 생성, 스프링 validator를 implements 합니다 이때 오버라이드하는 메소드는 총 2가지 입니다 1. supports 메소드 이미 우리는 바로 전 시리즈인 ..
하이버네이트 커스텀 벨류 타입 - 3 이번 포스팅에서는 어떻게 커스텀하는지에 대해 알아보겠습니다 아래와 같은 3단계 과정을 거쳐 진행하겠습니다 1. 우선 하이버네이트의 Type을 상속받은 커스텀 타입객체를 하나 제작합니다 2. 해당 타입 객체에서 사용할 Descriptor 객체도 하나 제작합니다 3. 이렇게 제작한 Type을 등록해줍니다 public class AgeType extends AbstractSingleColumnStandardBasicType implements DiscriminatorType { public static final AgeType INSTANCE = new AgeType(); public AgeType() { super(IntegerTypeDescriptor.INSTANCE, AgeTypeDescriptor.IN..
하이버네이트 커스텀 벨류 타입 - 2 이번 포스팅에서는 소스 코드를 통해 완성된 사례를 살펴보고, 다음 포스팅에서 자세한 원리를 다뤄 보도록 하겠습니다 먼저 다음과 같이 입맛에 맞게 Age라는 객체를 정의하였습니다 package pkgPath; public class Age { private final int age; public Age(int age) { if (age200) { throw new RuntimeException("올바른 나이 범위를 벗어난 입력 입니다"); } this.age = age; } public int getAge() { return age; } public Age plusAge() { return new Age(age+1); } } 원시 데이터 타입을 단순히 래핑한 형태로 특별한 기능은 없습니다(그냥 이상한 범위..
하이버네이트 커스텀 벨류 타입 - 1 안녕하세요 블로그 주인입니다 바로 어제까지해서 몇군데 최종까지 갔다 우수수 떨어져 3월까지는 영어 성적 갱신과 새로운 프로젝트를 목표로 달리고 있습니다 가벼운 마음으로 이미 했던 자바/스프링기반 간단한 웹서비스 제작을 계획하고 있는데, 문득 하이버네이트에 대해 생각해보게 되었습니다 웹서비스를 운영하다 보면, 계획했던 의도와 다르게 서비스를 사용하는 유저들을 자주 만날 수 있습니다 알수없는 글을 도배한다든가, 이상한 요청을 보낸다든가, 메세지에 도스 이미지를 담아 보낸다든가(어떻게 그런 정성을...) 이런 경우 중 대표적인 사례는 아래와 같습니다 유저 엔티티의 나이를 int형으로 받고 있는데 이때 음수값이 들어오는 경우 미리 유효한 값인지 판단하는 로직에서 이를 처리해주면 좋겠지만, 이상한 값이 들어오는 ..
더 자바, 코드 조작 정말 떨리는 마음을 뒤로한채... 자바 포스팅입니다 리플렉션, 다이나믹 프록시, 어노테이션 프로세서 3가지가 핵심 주제였습니다 워낙 흥미로운 내용이라 하루만에 강좌를 모두 들었고, 리플렉션과 다이나믹 프록시는 어느정도 이해했습니다(2번씩 봤습니다ㅋㅋ) IOC 컨테이너의 작동 원리와 동적으로 프록시를 만드는 부분 또 lombok이 핵이라는 주제 등 흥미진진한 주제의 강의라 매우 만족스럽습니다
id generator 개발하기 - 2 (타임스탬프) snowflake id에서 첫번째 필드는 보통 그냥 공란으로 둬서 마찬가지로 스킵하겠습니다.(저는 그냥 1로 세팅하겠습니다, 대충 양수임) 다음으로 타임 스탬프 필드에 찍을 스탬프를 제작해보겠습니다. 시작에 앞서 간단하게 제작 과정을 요약하겠습니다. 1. 먼저 베이스가 필요합니다. 2. 다음으로 표기할 현재 시간이 필요합니다. 3. 각각의 DateTime을 Milliseconds로 변환해줄 변환기가 필요합니다. 본격적으로 베이스를 만들어 보겠습니다. LocalDateTime SDTOfAlphabet = LocalDateTime.of(1995, 10, 5, 12, 0, 0); 위처럼 DateTime형식으로 베이스가 될 시점을 하나 만들어 줍니다.(저는 제 생일로 베이스를 정했습니다) 다음으로 아래처럼 표기..
id generator 개발하기 - 1 (개요) 서버쪽에 붙힐 아이디 생성기를 제작해보겠습니다. DB서버에서 auto inc를 이용해 구현한 아이디를 생성기로 커스텀해서 구현하는 작업입니다. 이렇게 굳이 아이디 생성기를 제작하는 이유는 고가용성을 확보하기 위한 첫 단계이기 때문입니다. 회원가입 요청이 분당 매우 많이 발생하는 상황을 가정해 보면 이를 쉽게 이해 할 수 있습니다. 이런 상황에서 가능한 해결법은 크게 두가지로 스케일 업과 아웃이 있습니다. 이때 아웃을 적용하기 위해 필요한 것 중 하나가 바로 아이디 생성기입니다. 회원 정보를 저장하는 2개의 디비 서버가 있다고 생각해보면 상당히 직관적입니다. auto inc를 이용하여 아이디를 구현 한 경우 아래와 같은 문제 상황이 발생합니다. 디비 서버A로 가입 요청이 전달되면 A에서는 이를 1번 회원으..

반응형