일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 싱글 스레드
- 필드 주입
- open-in-view
- 불변 객체
- OSIV
- spring boot
- 메서드 주입
- mavenCentral
- Handler Adepter
- Request flow
- open session in view
- 익명 함수
- 빈
- 컴포넌트스캔
- 생성자 주입
- View Resolver
- Spring Framework
- @Bean
- 일괄처리
- Open EntityManager In View
- @FunctionalInterface
- Spring Batch
- 스프링 빈
- 가변 객체
- Dispatcher Servlet
- @Configuration
- Batch
- @componentScan
- 참조 타입
- 이펙티브 자바
- Today
- Total
목록전체 글 (18)
보다 더 나은 내일의 나를 위해
서론 여러분은 프로그래밍을 하면서 '객체를 래핑 한다', '클래스를 래핑 한다'라는 말을 들어본 적 있나요? 만약 들어보지 못했다고 해도 괜찮습니다. 오늘은 클래스를 래핑 하는 방법과 사용하는 이유에 대해서 알아볼 것입니다. Wrapping wrapping을 직역하면 어떤 뜻인가요? 말 그대로 '싸다', '포장하다' 정도로 해석할 수 있습니다. 그렇다면 '클래스를 래핑 한다'라는 말은 어떻게 해석할 수 있을까요? 이 역시 클래스를 포장해서 사용한다고 볼 수 있습니다. 그럼 이 래핑은 어떻게 할까요? 기본적으로 다음과 같이 래핑 할 수 있을 것입니다. class Food { } class FoodWrapper { private final Food food; public FoodWrapper() { this..
서론 주변 개발자 중에 오버라이딩과 오버로딩의 개념이 정확히 잡히지 않은 상태에서 이 둘을 혼동하는 경우를 봤습니다. 말이 비슷하기도 하고, 새로 다시 쓴다는 큰 틀에서의 개념도 비슷해서 그런 것 같습니다. 따라서 이번에는 오버라이딩과 오버로딩을 차례대로 알아보겠습니다. 또한 이 블로그에서는 Java를 기본 언어로 사용합니다. 오버라이딩 오버라이딩은 객체 지향에서 나온 개념입니다. 그러다 보니 위키피디아의 객체 지향 프로그래밍 문서를 보다 보면 다음과 같은 말을 볼 수 있습니다. 같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것 실제로 오버라이딩은 클래스와 클래스 사이에서 사용됩니다. 정확히는 클래스간 상속 관계에서 자식 클래스에 사용됩니다. 오버라이딩은 매서드의 내용을 다시 쓰는 것입니다. 동..
개요 프로젝트를 진행 중 가끔 필요한 build.gradle에 dependency를 추가해야 하는 상황이 생길 수 있습니다. 또는 프로젝트 생성할 때 실수로 추가하지 않아 따로 추가해야 하는 상황이 생길 수도 있죠. 그러다 보면 가끔씩 원하는 dependency를 추가할 때 어떻게 써야 하는지 헷갈리거나 까먹을 때가 있습니다. gradle 환경뿐만 아니라 maven, SBT, lvy 등등 최근 통상적으로 dependency를 mavenCentral에서 가져오는 환경일 때 쉽게 찾아볼 수 있는 방법을 알아봅시다 MavenCentral 보통 jcenter이 서비스가 종료되고, MavenCentral를 많이 사용합니다. gradle 환경을 예시로 든다면 프로젝트를 생성할 때 기본적으로 repositroy가 다..
개요 1 : N의 연관관계를 맺고 있는 두 테이블이 있습니다. 이 두 테이블에서 데이터를 찾아오는 방법은 JOIN 키워드를 사용해 FK를 통해 조회하는 것과 서브쿼리를 사용해 where 키워드를 사용해 조회하는 방법이 있습니다. 물론 버전에 따라나 상황에 따라 차이가 있지만 일반적인 상황에서 두 방법 중 어떤 쿼리가 더 빠를까요? 준비 우선 환경은 다음과 같습니다. 이 부분은 테스트를 하기 위한 환경을 준비하는 단계이므로 그렇구나 하고 보시면 됩니다. M1 MacBook Pro 2020 Memory : 16GB MySQL : 8.0.26 또한 테스트를 위해 데이터를 많이 입력할 텐데 일일이 하기는 힘드니 스프링을 활용할 것입니다. 프로젝트 설정은 다음 깃허브에서 확인할 수 있습니다. https://gi..
개요 코딩하고, 프로그램을 만들다 보면 어떤 기능을 만들 때 제약이 많은 것을 느낄 수 있습니다. 또한 왜 이 제약이 필요한지도 궁금한 상황이 나오곤 합니다. 이때 Spring Boot에서 제약은 다음과 같이 예를 들 수 있습니다. 컴포넌트들은 스프링 빈에 등록시켜 싱글톤으로 관리합니다. @Controller를 사용해서 url을 매핑합니다. @RestController에서는 기본적으로 json을 반환합니다. 외부 라이브러리 등은 gradle, maven 등을 통해 관리합니다. 이러한 제약은 왜 있는 걸까요? 이 외에도 @Before 어노테이션처럼 특정 기능 지원을 목적으로 로직에 제약을 거는 어노테이션들도 있습니다. 장점? 단점? 프로그래밍은 언어 자체에도 여러 가지 제약이 있습니다. 자바에서 '객체를 ..
개요 스프링은 클래스 간의 의존성을 풀기 위해 의존성 주입을 사용합니다. 의존성 주입을 할 때 크게 2가지 방법이 있습니다. @Autowired 어노테이션 활용 생성자 주입 위 두 가지 방법 모두 의존성을 성공적으로 주입해 줍니다. 하지만 스프링 4.3부터는 2번째 방법인 생성자 주입 방법을 권장합니다. ⚠︎ field injection is not recommended 그렇다면 이 둘의 차이점과 왜 생성자 주입 방법을 권장하는지 알아봅시다. 생성자 주입 사실 생성자 주입 방법을 사용한다고 해도 @Autowired 어노테이션이 사용됩니다. 만약 @Autowired를 생성자에 붙여주지 않고, 단일 생성자만 존재한다면 어노테이션이 사용되지 않아도 항상 사용됩니다. 또한 생성자가 많다면 가장 많은 필드에 의존..
개요 예전에 했던 프로젝트를 조금 리펙터링 하던 중 인터셉터를 사용할 일이 있었습니다. 그러다 문득 '예전에 인터셉터와 필터가 무엇이 다른지 봤었는데'라는 생각이 났지만, 기억이 나지 않았습니다. 그래서 이 기회에 정리해 보려고 합니다. 실행 시점 우선 필터와 인터셉터는 스프링 플로우 중 실행 시점이 다릅니다. 위 그림에서 알 수 있듯, 필터는 DispatcherServlet보다 먼저 실행됩니다. 따라서 필터는 웹 애플리케이션의 Context 기능이라 Spring의 Context에 접근하기 힘듭니다. 반대로 인터셉터는 Spring Context 안에서 실행됩니다. Controller가 동작하기 전에 실행되죠. 따라서 다른 빈을 사용하는 등 다른 Spring Context에 접근하기 편리합니다. uri 패..
개요 자바에서는 람다와 클로저를 지원합니다. 이 람다와 클로저를 사용할 수 있는 방법은 많습니다. 하지만 이번 포스트에서는 람다와 클로저의 간단한 사용법과 차이점, 람다를 사용할 수 있게 해주는 인터페이스 몇 가지만 알아봅시다. 람다 함수 프로그래밍 언어에서 사용되는 람다 함수라 하면 익명 함수(Anonymous Function)를 말합니다. 이 람다 함수의 특징은 다음과 같습니다. 익명 함수이므로 함수의 이름이 붙지 않습니다. 이름이 없기 때문에 재사용할 수 없습니다. 지연 연산을 하며 병렬 처리가 가능합니다. 람다 함수는 보통 화살표(->)를 사용해 표현합니다. (int x, int y) -> {return x > y ? x : y} 이때 람다는 매개변수를 받아 바디에서 사용합니다. 또한 자바에서 람..
개요 record는 자바 14 버전에서 새로 추가된 클래스의 종류 중 하나입니다. 다음 문서에서 설명하는 record의 목적은 다음과 같습니다. 데이터를 데이터로 모델링하기 - JEP 359 record 클래스의 간단한 특징은 다음과 같이 정리할 수 있습니다. record 클래스는 final 클래스이다. 모든 필드가 private final로 선언된다. 모든 필드에 대해 초기화하는 생성자가 생성된다. 각 필드에 대해 필드 명을 딴 getter가 생성된다. (ex. private final String name -> public String name()) equals(), hashCode(), toString() 함수를 암묵적으로 정의한다. 이런 특징들을 봤을 때, @Service 클래스는 의존성 주입을 ..
📎부제. 자바의 변수 관리 개요 자바가 실행되는 환경인 JVM(Java Virtual Machine)에서는 당연하게도 메모리 공간이 있습니다. 이 메모리 공간에 오늘 알아볼 스택과 힙이 존재합니다. 먼저 스택과 메모리에 대해 간단히 알아봅시다. 스택 모든 스레드에 각각 존재한다. 원시 타입의 변수들이 값과 함께 저장된다. 참조 타입의 변수일 경우 힙에 저장된 데이터의 주소 값을 저장하게 된다. 변수의 스코프가 끝나면 소멸한다. 힙 모든 스레드가 힙을 공유한다. 참조 타입 데이터가 저장된다. GC(Garbage Collector)에 의해서 값이 소멸한다. 스택과 힙은 다음과 같은 특징을 가지고 있습니다. 더 자세히 알아봅시다. 원시 타입 관리 우선 자바의 원시 타입에는 int, flaot, long, do..