본문 바로가기

Programming

(110)
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은 물리적 저장장치에서 데이터를 어떤 식으로 구성하고 읽어올지를 ..
[Spring] 자동설정 (AutoConfiguration) 스프링에서 그 많던 설정은 스프링부트로 넘어오면서 어디로 사라진걸까?? 스프링부트는 스프링에서 주로 사용했던 설정들을 자동으로 설정한다. 이 기능은 자바의 main 진입점에 @SpringBootApplication 을 붙임으로서 사용할 수 있다. @SpringBootApplication class Application @SpringBootApplication 안에 있는 @ComponentScan 과 @EnableAutoConfiguration 어노테이션을 통해 프로젝트의 스프링 빈을 찾아내어 등록한다. @ComponentScan 은 @Repository @Configuration @Service등을 찾아내어 스프링 빈으로 등록하는 기능을 가진 어노테이션이다. @EnableAutoConfiguration은..