Programming (111) 썸네일형 리스트형 Spring 순환참조(Circular Depencies) 해결하기 스프링에서 빈 순환참조가 일어날 때 회피하는 방법을 알아보자. Redesign 사실상 재설계하는 것이 가장 바람직한 방법이다. 하지만 실제 운용할 때에는 재설계할 수 없는 상황이 허다할 것이다. (레거시와 많이 엮여있거나, 이미 테스트가 끝난 경우) Use @Lazy 가장 심플한 방법으로 주입하는 곳에 @Lazy 키워드를 붙이는 것으로 해결할 수 있다. 완전히 빈을 초기화하는 것 대신에 프록시가 대신 주입되는 방법이다. 실제로 해당 빈이 사용될 때 빈이 주입되는 방식이다. Use Setter/Field Injection 가장 많이 사용되는 순환참조 회피 방법으로 Constructor 주입 방법 대신 Setter, Field 주입 방법을 사용하는 것이다. Use @PostConstructor 빈 주입을 @.. Gradle & Build 그리고 IntelliJ의 Build gradle을 알아보기 전에 컴파일, 빌드의 개념을 알아보자 컴파일과 빌드 요즘엔 IDE가 워낙 좋아져서 컴파일과 빌드의 차이를 모르는 경우가 많다. 왜냐하면 대부분 툴에서 그 둘을 동시에 Run하나로 퉁치기 때문이다. 컴파일 : 소스의 문법을 분석해 기계어로 번역, 자바의 경우 JVM에서 실행 가능한 바이트코드 형태의 클래스 파일이 생성된다. 링크 : 소스 파일이 여러 개가 생성이 되고, 소스 파일에서 각각의 함수를 호출하는 경우가 있으므로, 연결작업을 해주는데 이작업을 링크라고 한다. 빌드 : 실행 가능한 파일을 만드는 것을 의미한다. 하나의 실행 파일로 생성되기 위해서는 컴파일 과정과 링크 과정을 거쳐야 하므로, 컴파일과 링크가 빌드 안에 포함되는 개념이라고 볼 수 있다. 컴파일은 번역 하나만을 담.. [Spring] @ModelAttribute vs @RequestParam @ModelAttribute와 @RequestParam의 차이 우선 파라미터로 받는 부분만 말하자면, RequestParam은 1:1로 받는 반면, ModelAttribute는 도메인 오브젝트나 DTO 요청 파라미터를 바인딩해서 한번에 받는다. @RequestParam과 단지 바인딩의 차이만 있는 것은 아니다. 검증 작업이 추가적으로 진행된다. RequestParam은 파라미터 타입이 잘못 들어오면 400 Bad Request를 날리지만, ModelAttribute는 타입 변환에 실패하더라도 작업은 계속 진행된다. 주의할 점 위에서 설명했듯이 ModelAttribute는 타입변환에 실패하더라도 작업은 진행된다. 단지 타입 변환 중에 발생한 예외가 BindException 타입의 오브젝트에 담겨서 컨트롤러.. Spring Event에 대해서 알아보자 Spring에서 이벤트를 발생시켜 핸들링하는 방법으로는 여러가지가 있다. 그 중에서도 어노테이션을 활용하는 몇가지만 알아보자. 이벤트는 어떤 경우에 사용할까? 보통의 경우에는 그렇게 중요하지 않은 SIDE격 작업을 비즈니스 로직과 느슨하게 연결하기 위해 사용된다. 이벤트 어노테이션 종류 @EntityListeners @EventListener @TransactionEventListener @EntityListeners 엔티티를 DB에 적용하기 이전 이후에 커스텀 콜백을 요청할 수 있는 어노테이션이다. @Entity @Table(name = "product_item") @EntityListeners(ProductItemListener::class) data class ProductItem 위와 같이 Ent.. Base64 인코딩 (+ Base58) 인코딩이란? 인코딩(encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 말한다. Base64 Base64는 인코딩 방식 중에 하나로 문자 코드에 영향을 받지 않은 64개의 아스키 영역의 문자들로 이루어진 문자열로 변경하는 것을 말한다. 데이터가 여러 플랫폼에서 통신하면 플랫폼의 차이로 데이터가 깨질 수도 있다. 이를 방지하기 위해 아스키 문자열이라는 공통 캐릭터를 사용하여 안전하게 데이터를 송수신한다. Base64의 본래 뜻은 64진법이라는 뜻이다. 8진수는 octet digits 또는 base8, 16진수는 hexdecimal 또는 base16이 된다. 사용 용도 Base64는 압축의 목적도 아.. [Spring] DI - 빈 주입하기 With Kotlin Spring에서는 빈을 주입하는 방법은 세가지가 있다. Field Setter Constructor Field 우선 첫번째 방법으로는@Autowired 어노테이션을 이용하여 주입하는 방법이다. @Service class UserService { @Autowired private lateinit var userRepository: UserRepository ... // Business Logic } Constructor 다른 방법으로는 생성자에 주입할 객체를 파라미터로 작성하는 방법이다. @Service class UserService(private val userRepository: UserRepository) { ... // Business Logic } 위의 UserService 클래스처럼 생성자가 .. [Spring] @Retryable 어노테이션 특정 Exception이 발생했을 경우 일정 횟수만큼 재시도할 수 있는 어노테이션이다. 예를 들어, 서비스 내에서 다른 서비스에 있는 API를 호출할 때 간헐적으로 토신 오류가 발생할 수 있다. 하지만 이때마다 사용자가 에러메세지를 받아본다면 당혹스러울 것이다. 사용법은 아주 간단하다. 1. Spring Application에 @EnableRetry 어노테이션 추가 2. 재시도 하고 싶은 메소드에 @Retryable 어노테이션 추가 - include : 여기에 설정된 특정 Exception이 발생했을 경우 retry한다. - exclude : 설정된 Exception 재시도 제외 - maxAttempts : 최대 재시도 횟수 (기본 3회) - backoff : 재시도 pause 시간 @Retryable(.. [MySQL] Storage Engine (InnoDB vs MyISAM) 생각없이 Engine을 InnoDB만 사용했지 왜 이것을 사용해야 하는지 고민해본 적이 없었다. 하지만 어떠한 Storage Engine을 써야할지 고민할 일이 생겼다. 전문과 로그에 관련된 데이터를 테이블에 적재해야하는데, 전문과 로그의 경우 정규화하기도 애매하고 Key가 상당히 많았다. 대략 300개에 달하는 칼럼이 필요한 상황이였다. 그래서 어떻게 테이블에 적재해야 효율적인지 고민이 필요했다. 또한 InnoDB 테이블에 많은 칼럼을 추가하니 Row size too large. 라는 오류가 발생해서 Engine을 변경하는 방법을 생각하게 되었다. 우선 각 Stroage Engine에 대해 알아보았다. Mysql Storage Engine은 물리적 저장장치에서 데이터를 어떤 식으로 구성하고 읽어올지를 .. 이전 1 2 3 4 5 6 7 ··· 14 다음