목록Spring (10)
개발그래머
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is java.lang.IllegalStateException: Unable to create the directory [/tmp/tomcat.*] to use as the base directory개발 서버 배포 문제 해결 과정개발 서버를 배포하는 과정에서, 배포가 완료되지 않고 애플리케이션이 계속해서 실행 종료를 반복하는 현상이 발생했다.처음에는 소스 코드 수정 과정에서 발생한..
개요 서비스를 운영하다 보면 간헐적으로 요청 오는 정보(ex. 코드로 처리하면 편리한 경우) 작업들 또는 암호화 / 복호화 같은 애플리케이션 내부에서만 처리할 수 있는 작업(ex. 유저의 복호화된 전화번호 정보가 담긴 엑셀파일이 필요하다) 해당 유저 혹은 작업에 대한 복합적인 여러 정보들을 쉽게 확인할 수 있도록 하는 작업(ex. 여러 테이블들에 있는 정보들이 필요하다) 위의 운영 작업들을 효율적으로 처리하기 위해 ApplicationRunner와 CommandLineRunner를 활용한 방법들을 소개합니다. ApplicationRunner와 CommandLineRunner 인터페이스란? 스프링부트 애플리케이션을 시작할 때 어떤 동작을 수행하도록 지원하는 인터페이스이며 Runner 인터페이스를 상속받고 ..

개요1차 캐시가 동작하지 않아 생각한 쿼리의 양보다 많은 쿼리가 나가는 경우가 종종있었다.어떠한 경우 어떠한 문제로 발생하는지 한번 알아보자.예제 코드@Entity class Post ( var title: String, var content: String, var subTitle: String ) : BaseEntity() @MappedSuperclass abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null @CreationTimestamp @Column(updatable = false) val createdAt: LocalDateTime? = null @UpdateTi..
Spring의 @TransactionalEventListener를 사용하는 이유?(@EventListener와의 차이점) Spring 4.2부터 이벤트리스너를 트랜잭션 단계에서 바인딩할 수 있는 @EventListener의 확장 애노테이션 트랜잭션 내에서 이벤트를 수신하고 처리함 기존 이벤트리스너는 데이터의 불일치가 생길 가능성이 있음 @Transactional fun save() { aRespository.save(); eventPublisher.publishEvent(aEvent); bRepository.save(); eventPublisher.publishEvent(bEvent); } bRepository를 저장하는 과정에서 에러가 발생한다면 aEvent가 만약 비동기로 발행된 상황이면 예상하지 못..

Spring의 @EventListener를 사용하는 이유? 컴포넌트 간의 결합도를 감소시켜 직접적인 의존성을 줄일 수 있음(느슨한 결합) -> 재사용성 높임 PostService와 MailService가 있을 시 PostService안에 MailService에 대한 의존성을 가지고 있지 않고 Event를 발행함으로써 직접적인 의존도를 가지지 않음 새로운 기능이나 모듈을 추가할 때 적절한 이벤트를 생성하고 리스너를 등록함으로 기존 코드를 변경하지 않고 새로운 기능을 통합할 수 있는 확장성과 유연성을 제공함 클래스별 의존성을 줄이므로 테스트가 용이해짐 사용 방법 스프링 4.2 이전에는 ApplicationEvent를 상속받아야 하고 ApplicationListener 인터페이스를 구현해주어야 했지만 이후에는..
발견 스프링 multiple datasource 설정을 하기 위해 스프링부트에서 제공하는 default datasource를 사용하지 않고 수동으로 등록해 주는 작업을 하였다.(참조 : https://www.baeldung.com/spring-data-jpa-multiple-databases) //datasource 설정 @Configuration @EnableJpaRepositories( basePackages = "com.**.repository", entityManagerFactoryRef = "originEntityManager", transactionManagerRef = "originTransactionManager" ) public class PersistenceOriginConfig { @..

Antifragile(변화에 바로적응, 비용 저렴) auto scaling : 자동 크기 조정 microservices chaos engineering : 시스템이 격동의 예측치 못한 상황을 견딜 수 있도록 신뢰성을 쌓기 위해 운영 중인 소프트웨어 시스템에 실험을 하는 규율 continuous deployments 확장 가능한 아키텍처 수평적 확장에 유연 확장된 서버로 시스템 부하 분산, 가용성 보장 시스템, 서비스 애플리케이션 단위의 패키지(컨테이너 기반) 모니터링 탄력적 아키텍처 서비스 생성 - 통합 - 배포, 비즈니스 환경 변화에 대응 시간 단축 분할된 서비스 구조 무상태 통신 프로토콜 서비스의 추가와 삭제 자동으로 감지 변경된 서비스 요청에 따라 사용자 요청 처리(동적 처리) 장애 격리(Fault..
JWT(Json Web Token) 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준(RFC 7519) 이 정보는 디지털 서명되어 있으므로 확인하고 신뢰 가능 JWT는 secret 또는 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명 가능 JWT는 암호화하여 당사자 간에 비밀성을 제공JWT 사용 이유 권한 부여 : 가장 일반적인 방법, 사용자가 로그인하면 이후에 각 요청에 JWT가 포함되어 사용자가 해당 토큰에 허용된 경로, 서비스 및 리소스에 접근 가능 정보 교환 : 당사자 간에 정보를 안전하게 전송 가능 JWT는 크기가 작아 HTML 및 HTTP 환경에서 전달하기 좋음 공개/개인 키 방식 사용 가능 JSON 파서는 개체에 직접..