프로젝트를 진행하면서 파일들이 하나둘씩 늘어남에 따라 패키지 구조를 바꿔야겠다는 생각이 들었습니다. 먼저 저의 패키지 구조를 먼저 보여드리고 어떻게 변경하였는지 설명하겠습니다. 계층형 main ├── java │ └── stude │ └── chalieZip │ ├── config │ ├── controller │ ├── service │ ├── repository │ ├── dto │ ├── entity │ ├── interceptor │ └── CharlieZipApplicaton.java └── resources └── application.properties 저의 패키지 구조는 계층형 구조로 각 계층을 대표하는 디렉터리 기준으로 코드들이 구성됩니다. 처음에 프로젝트를 시작할때는 매우 작게 규모로 ..
CharlieZip 프로젝트를 진행하면서, 로그인 기능이 구현하고 나니 많은 부분에 로그인여부를 체크해야하는 일이 발생하였습니다. 그로 인해, 많은 코드 중복이 발생하게 되었고, 추후 추가나 변경이 있을시 일일히 찾아가며 수정을 해야하기 때문에 유지보수성이 매우 떨어질 수 있습니다. 그래서 로그인 여부 로직을 한 곳으로 분리하여 관리하도록 리팩토링을 진행하였습니다. AOP VS Interceptor 애플리케이션 여러로직에서 공통으로 관심이 있는것을 공통 관심사(cross-cutting concern)라고 합니다. 이러한 공통 관심사는 스프링의 AOP로도 해결할 수 있지만, 저의 공통 관심사는 로그인 여부이고 이는 웹과 관련된 공통 관심사입니다. charlieZip 프로젝트는 rest api가 아닌 뷰 템..
Bean Validation은 많은 편리한 기능을 제공해 주지만 그럼에도 추가적인 기능이나 필요한 제약을 직접 정의해서 사용하고 싶을 때가 있습니다. 저는 프로젝트를 진행하다 Enum 타입을 String으로 입력받게 해논 경우가 있었는데 String으로 입력받을 경우 Enum타입으로 선언해 놓은 값 이외에 값도 입력받을 수 있게 되고 이러면 Enum 타입을 쓰는 장점이 사라지게 됩니다. 그래서 어떻게 검증할 수 있을까라는 생각이 들어서 찾아보니 Bean Validation을 직접 정의하는 방법이 있었습니다. 이번에는 Enum 타입 검증 기능을 직접 정의해보겠습니다. (물론, Enum타입을 String타입대신 기존의 Enum타입으로 입력받으면 상관없지만 공부 목적으로 구현해보았습니다..) Validatio..
개발을 할때 기능을 개발하는것 만큼 중요한게 validation 입니다. 그중에서 클라이언트로부터 입력받은 값의 오류로 발생하는 장애가 꽤 많습니다. 입력받은 값이 잘못되면 전혀 예상치 못한 곳에서 에러가 발생하여 원인 파악이 힘든 경우가 많이 발생하게 됩니다. 그래서 클라이언트로부터 입력받은 값을 검증할때 Bean Validation Annotation을 사용합니다. Annotation의 종류와 기능에 대해 알아보겠습니다. Bean Validation 시작하기 환경설정 build.gradle implementation 'org.springframework.boot:spring-boot-starter-validation' Spring Boot Validation Starter를 추가해줍니다. 이것만으로 ..
기존 Validation 현재 제가 구현해놓은 validation을 먼저 보여드리고 왜 리팩토링을 할려고 하는지 설명하겠습니다. 회원가입 시 검증 요구 사항 필드 검증 이름 : 필수 비밀번호 : 필수, 공백X 생년월일 : 8자리 숫자 MemberForm - 회원가입 저장 폼 package study.charlieZip.dto; import lombok.Getter; import lombok.Setter; import study.charlieZip.entity.Gender; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Not..
예전에 혼자 구현했던 프로젝트의 코드를 리팩토링 해보겠습니다. 다시 코드를 보니 고쳐야 할부분도 많이 보이네요. 이 글에서는 타임리프기능을 리팩토링 해보겠습니다. Thymeleaf가 스프링에서 사용할 때 편리한 기능들이 많이 있습니다. 처음 프로젝트를 진행할 때 뷰 템플릿에 대한 기능은 프론트 부분이다 라고 생각하여 기능 구현을 하는데 급급하였습니다. 추후에 잘못된 생각이었다고 깨달으면서 타임리프에 대해 공부하였고, 공부한 내용을 바탕으로 저의 프로젝트 코드들을 리팩토링 해보겠습니다. 1. 템플릿 레이아웃 HTML로 웹 페이지를 만들다 보면 Head 부분에 많은 중복된 코드가 발생하게 됩니다. 웹 폰트, css, 파비콘 같은 자료들은 매 페이지 마다 고정으로 들어가게 되는데 중복 코드를 줄여주기 위해 타..
AWS Builders 프로그램에서 온라인으로 e-commerce에 대해 발표를 한다고 하는데 커머스 사업에 관심이 있어 신청을 하여 발표를 들었는데요 여러 발표 중 가장 흥미로웠던 무신사가 IDC환경에서 클라우드 환경으로 전환하는 과정을 설명해주는 발표에 대해 정리하겠습니다. [ 클라우드로 이전하게 된 계기 ] 결정적인 계기 매년 블랙프라이데이 행사 때 트래픽 증가 기존 IDC의 환경의 문제 유동적인 서버 확장의 어려움 등의 IDC 환경의 문제 업무 방식의 문제 일에 팀을 맞추게 된다. 예를 들면 새로운 일 A를 추진하게 되면 기존 업무 방식에선 각 팀마다 사람을 뽑고 회의를 통해 새로운 일 A에 대해 정의한뒤 프로젝트를 진행한다. 진행이 완료되면 사람들은 각자 자신의 기존 팀으로 되돌아 간다. 이러한..
[ HTTP 인증 ] HTTP 에서 이용할 수 있는 인증 방식에 대해 공부해보겠습니다. BASIC 인증 DIGEST 인증 SSL 클라이언트 인증 폼 베이스 인증 이 밖에도 통합 Windows 인증 등이 있지만 이 글에서는 위 4가지 인증방식에 대해서만 알아보겠습니다. HTTP 인증은 대단한 방법이 있는게 아닌 HTTP 통신을 할때, 특정 헤더를 추가해 정보를 넘겨준다거나, 보안과 관련된 정보를 추가해 넘겨주는 방식을 사용하게 됩니다. 아래의 글을 읽으시면서 각 인증방식들이 HTTP통신을 할때 어떤 정보들을 추가해서 통신을 하는지 차이점을 살펴 보며 읽어보시면 좀 더 도움이 되실 수 있을거 같습니다. [ BASIC 인증 ] BASIC 인증은 웹 서버와 대응하고 있는 클라이언트 사이에서 이뤄지는 인증 방식입..
- Total
- Today
- Yesterday
- java
- JUnit5
- IntelliJ
- datasource
- Collection
- BatchStatus
- mockito-kotlin
- Parameterized
- kotlin
- autoconfigure
- A레코드
- test
- Spring
- 시나리오 테스트
- prinicipal
- 클린 아키텍처
- GSLB
- WrongTypeOfReturnValue
- meta-data
- trailing comma
- mockK
- Spring Batch
- ExitStatus
- Mockito
- spring data jpa
- Stream
- assertj
- scenario test
- asSequence
- AWS INDUSTRY WEEK
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |