일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 파이썬 소스
- 문법 정리
- 프로젝트
- 티스토리
- 오라클
- 알고리즘
- smart cast
- 운영체제
- hyperledger
- 자바 프로젝트
- SQL
- 백준 알고리즘
- 초대장
- jsp
- oracle
- 오라클 디비
- dynamic query
- 유사코드
- 파이썬
- JVM
- spring
- MongoDB
- K6
- 리눅스
- 학점
- resilience4j
- c#
- auto configure
- gradle
- Today
- Total
목록Programming/Spring (25)
모종닷컴
진행하고 있는 프로젝트가 슬슬 마무리가 되어가네요.. 포스팅할 거리가 많은데 프로젝트가 끝나면 하나씩 정리해서 올리도록 하겠습니다. 너무 오랫동안 글을 못 올리는 게 싫어서 짧은 글이지만 소개해보려고 합니다. 의존하고 있는 빈이 많은 클래스들이 간혹 보입니다. 설계를 잘못한걸수도 있지만 이런 클래스들은 특히 단위 테스트 코드를 짤 때 정말 귀찮습니다. 예시를 보도록 하겠습니다. 예시 코드 private val log = KotlinLogging.logger { } @Service class WelcomeStep { fun execute() { log.info("welcome") } } @Service class EnjoyStep { fun execute() { log.info("enjoy") } } @S..
오늘은 정말 간단한 글 하나를 올려보려고 합니다. 내용은 멀티 모듈 프로젝트에서 모듈의 겹치는 이름으로 인해 겪은 삽질기입니다. 상황을 재현해보기 간단하게 세팅을 먼저 해보도록 하겠습니다. 프로젝트 구조 프로젝트는 projectA, projectB 두 개로 만들어져 있습니다. projectA는 app, domain 모듈을 지니고 있고, projectB는 domain 모듈만 지니고 있습니다. projectA 빌드스크립트 war 관련 파일 설정이 추가되어있습니다. apply plugin: 'war' bootWar { mainClassName = "com.example.projectA.app.MainAppKt" // 코틀린 파일이 자바로 해석되면서 클래스명 뒤에 'Kt'가 붙는다 archiveName("${p..
멀티 모듈 프로젝트를 사용하다 보면 하위 모듈의 프로퍼티 파일이 필요한 경우가 생깁니다. 예시를 들어보겠습니다. module-a와 module-b가 존재합니다. module-b에는 암호화 관련 서비스가 존재하고 module-a에서는 이 암호화 서비스가 필요하여 module-b를 사용하려고 합니다. 프로젝트의 구조를 보면 아래와 같습니다. module-a의 프로퍼티 파일(/src/main/resources/application.yml)이 존재하고, module-b의 프로퍼티 파일이 존재합니다. Module B @Service class CipherService( @Value("\${encrypt.secretkey}") SECRET_KEY: String ) { private val keySpec = Secr..
3계층 구조 Presentation Layer : 사용자 중점 계층 (front-end) Business Layer : 비즈니스 로직 계층, presentation layer의 요구를 받아 처리하는 곳 (back-end) Data Layer : 데이터베이스에 접근하여 데이터를 읽거나 쓰는 작업등의 역할 Mock Layer란? Mock Layer라는 개념이 존재하는 것은 아니고 제가 임의로 편하게 부르기 위해서 지어봤습니다. 위의 3계층 구조에서 Business Layer에 속하게 됩니다. 테스트 코드를 짜다보면 mockito 라는 테스트 프레임워크에 대하여 한번쯤은 들어보셨을 겁니다. 어떤 특정 요청에 대하여 개발자가 지정한 결과를 내려주는 방식인데 이러한 것을 실행 환경에서도 사용하기를 원했습니다. 한..
아주 예전부터 Quartz에 대한 글을 써야지 생각만 하고 어느새 잊어버렸는데요. 이번 회사 동료가 Quartz 적용을 한 발표를 하는데 너무 오래전에 본 내용이라 기억이 하나도 안나네요.. 그래서 기억좀 되살릴겸 Quartz 정리를 좀 해보았습니다. Quartz Job Scheduling 란? Quartz는 작은 독립형 애플리케이션부터 거대한 e-commerce 시스템에 이르기까지 거의 모든 Java 애플리케이션 내에 통합될 수 있는 풍부한 기능을 갖춘 오픈 소스 작업 스케줄링 라이브러리입니다. Quartz는 수십, 수백, 심지어 수만 개의 작업을 실행하기 위한 단순하거나 복잡한 일정을 만드는 데 사용될 수 있습니다. Quartz Scheduler에는 JTA 트랜잭션 및 클러스터링 지원과 같은 많은 엔..
스프링 시큐리티의 PreAuthorize를 사용하다가 조심해야 할 부분인 것 같아 글로 적어봅니다. Gradle + Kotlin + Spring Boot + Spring Security 조합으로 프로젝트를 구성하였는데 이 구성을 블로그 글에 하나씩 올리자니 너무 내용이 길어지는 것 같아 전부 설명하지 않고 일부분만 코드를 올리도록 하겠습니다. Gradle Dependency 추가 implementation "org.springframework.boot:spring-boot-starter-security" Security Configure @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) class Sec..
AOP 주요 용어 알아보자. 용어 의미 Joinpoint Advice를 적용 가능한 지점을 의미. 메서드 호출, 필드 값 변경 등이 Joinpoint에 해당 Pointcut Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타낸다. Advice 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. ex) 메서드 호출 전, 후 Weaving Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다. 코드를 핵심 로직 코드에 삽입하는 것이 weaving Aspect 여러 객체에 공통으로 적용되는 기능을 Aspect라고 한다. Spring AOP와 AspectJ의 목표는 다르다. Spring AOP는 프로그래머가 직면하는 가장 일반적인 문제를 해결..
지난 1편에서는 리팩토링 중 스프링 프록시와 관련한 문제를 경험하였고 이에 대한 해결책 3가지를 알아보았습니다. 이번 포스트에서는 스프링이 프록시를 생성하는 방법 2가지에 대해 알아보는 시간을 가지려고 합니다. 그리고 스프링 부트에서 설정된 프록시 생성방법에 대해 설명드리겠습니다. 프록시란? 프록시를 검색해보면 아래와 같은 의미를 지니고 있음을 볼 수 있습니다. 어떤 일을 대신 맡아서 행하는 걸 뜻한다는 걸 알수 있습니다. 저희가 흔하게 듣는 프록시 서버가 바로 이러한 뜻입니다. 그리고 지금 포스트하려는 스프링에서 프록시는 어떠한 A객체의 일을 대신 위임받아 행하는 객체라고 이해해주시면 될 것 같습니다. 스프링에서 프록시 생성 방법 스프링에서 프록시를 생성하는 방법은 크게 2가지가 있습니다. CGLIB를..
코틀린 코드를 리팩토링하면서 만났던 에러를 공유합니다. 환경은 아래와 같습니다. kotlin + Spring Boot (2.2.13.RELEASE) kotlin allopen plugin 적용 spring-boot-starter-web 의존 추가 위에도 필요한 의존성이 있을 수 있습니다.. 이슈 같은 로직을 가지고 있지만 때에 따라 조금씩 다른 부분들이었고 앞으로도 재사용 가능성이 있는 코드이기에 이를 추상화시켜 재사용하는 것이 저의 목표였습니다. 따라서 공통적인 부분들을 모아 추상클래스를 아래와 같은 형태로 리팩토링을 하였는데요. private val log = KotlinLogging.logger { } abstract class EvaluationService { @Autowired private ..
인증이 되어있지 않은 사용자는 스프링 시큐리티의 필터링에 걸려 로그인 페이지로 향하게 된다. 나의 경우 처음에는 로그인을 성공했을 때 핸들러를 통해(SimpleUrlAuthenticationSuccessHandler를 상속받아 작성) 메인페이지로 돌아가게끔 URL을 지정하였다. 그렇다면 메인페이지말고 내가 로그인 페이지로 넘어가기전에 요청했었던 url로 넘어가고 싶다면 어떻게 해야 할까? 보통 다른 방법들을 찾아보았을 때 login페이지 컨트롤러에서 Session 값을 넣거나 하는 작업을 하는 것들을 보았는데, 사실 우리는 그럴필요가 없다. 레퍼런스에서 발견한 내용인데 두번째 문단을 읽어보면 인증전의 요청을 세션에 저장하고 있다고 얘기한다.그리고 세션에 저장되어 있는 속성의 이름은 SPRING_SECUR..