본문 바로가기

Programming/Java & JSP & Spring

(75)
JVM Memory와 Garbage Collection JVM Memory에 대해 알아보기 전에 JVM에 대한 구조와 개념을 살펴보자 프로그램이 실행되기 위해서는 Windows나 Linux같은 운영체제가 제어하고 있는 시스템 일부인 메모리(RAM)를 제어할 수 있어야 하는데, Java 이전에 C같은 대부분의 언어로 만들어진 프로그램은 이러한 이유 때문에 OS에 종속되어 실행되게 되었다. Java로 만들어진 프로그램은 JVM이라는 프로그램만 있으면 실행이 가능한데, JVM이 OS에게서 메모리 사용 권한을 할당받고 JVM이 Java 프로그램을 호출하여 실행한다. 이렇게 JVM위에서 동작할 수 있는건 JVM이 Java Byte Code를 OS에 맞게 해석해주는 역할을 해주기 때문이다. 하지만 JVM의 해석을 거치기 때문에 C언어 같은 네이티브 언어에비해 속도가 느..
JPQL과 영속성 컨텍스트 스프링 웹 프로젝트를 작업할 때, 온전히 JPA만으로 작업하기에는 어려움이 따를 수 있다. 예를 들어, 테이블 중 특정 필드만이 필요한데, JPA로 모든 필드를 메모리에 올리기에는 비효율적인 문제등을 들 수 있을 것이다. JPQL과 JPA를 조합해서 쓸 때 몇가지 주의할 점과 동작하는 방식에 대해 알아본다. 먼저 JPQL의 개념을 간단하게 다시 한번 살펴보자. JPQL JPQL은 SQL과 비슷한 문법을 가진 객체 지향 쿼리이다. JPQL의 탄생 배경은 JPA에서 제공하는 메서드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제로부터 비롯되었다. JPQL로 조회한 엔티티와 영속성 컨텍스트 JPQL로 엔티티를 조회하면 해당 엔티티는 영속성 컨텍스트에서 관리된다. 하지만, 엔티티가 아니라면 영속성 컨텍스트에서 관리..
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 클래스처럼 생성자가 ..