일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- AOP
- 그리디
- spring
- QueryDSL
- java
- 스프링
- Greedy
- 자바
- Spring Boot
- Android
- http
- Servlet
- db
- springdatajpa
- 알고리즘
- SpringBoot
- Exception
- 김영한
- kotlin
- 스프링 핵심 원리
- Proxy
- JPQL
- JDBC
- pointcut
- transaction
- Thymeleaf
- 스프링 핵심 기능
- 백준
- jpa
- 인프런
- Today
- Total
목록인프런 (528)
개발자되기 프로젝트
1. Margin: 경계선 외부로 간격 2. Padding: 경계선 내부로 간격
1. Splash Screen - 스플래시 스크린은 앱 구동시 보여주는 화면임. 2. Handler Main thread가 있고 별도의 Thread가 있다고 해보자. 만약 두 thread가 동시에 textView의 setText를 실행한다고 가정하자. - MainThread: setText("from Main") - BThread: setText("from B") 이렇게 동시에 시도하면 문제가 발생한다. 따라서 MainThread가 아닌 Thread는 Handler를 사용한다. Handler의 역할은 MainThread로 다른 Thread의 message를 전달하는 것이다. 즉 위와 같은 경우는 BThread가 setText("from B")라는 내용을 message에 담아 Handler를 통해 MAin..
Tip Amount: %s 위와 같이 resource에 Tip Amount: %s가 있다고 하자. %s 자리에는 다른 string이 들어가는 자리이다. 해당 Resource를 불러오기 위해서는 다음과 같이 사용하면 된다. getString(R.string.tip_amount, formattedTip)
국가마다 서로 다른 통화를 사용하며 십진수 형식 지정 규칙이 다릅니다. 예를 들어 1234.56의 경우 미국 달러로는 $1,234.56 형식으로 표시되지만 유로화로는 €1.234,56 형식으로 표시됩니다. 다행히 Android 프레임워크에서는 숫자를 통화 형식으로 지정하는 메서드를 제공하므로 개발자가 모든 변수를 알 필요가 없습니다. 사용자가 스마트폰에서 선택한 언어 및 기타 설정에 따라 시스템이 자동으로 통화 형식을 지정합니다. 더 자세히 알아보려면 Android 개발자 문서에서 NumberFormat을 참고하세요. calculateTip()에서, 다른 코드 뒤에서 NumberFormat.getCurrencyInstance()를 호출합니다. NumberFormat.getCurrencyInstance()..
스프링은 AOP 프록시 생성을 편리하게 제공하기 위해 오랜 시간 고민하고 문제들을 해결해왔다. 스프링의 기술 선택 변화 1. 스프링 3.2, CGLIB를 스프링 내부에 함께 패키징 CGLIB를 사용하려면 CGLIB 라이브러리가 별도로 필요했다. 스프링은 CGLIB 라이브러리를 스프링 내부에 함께 패키징해서 별도의 라이브러리 추가 없이 CGLIB를 사용할 수 있게 되었다. CGLIB springcore org.springframework 2. CGLIB 기본 생성자 필수 문제 해결 스프링 4.0부터 CGLIB의 기본 생성자가 필수인 문제가 해결되었다. objenesis 라는 특별한 라이브러리를 사용해서 기본 생성자 없이 객체 생성이 가능하다. 참고로 이 라이브러리는 생성자 호출 없이 객체를 생성할 수 있게..
스프링에서 CGLIB는 구체 클래스를 상속 받아서 AOP 프록시를 생성할 때 사용한다. CGLIB는 구체 클래스를 상속 받기 때문에 다음과 같은 문제가 있다. 대상 클래스에 기본 생성자 필수 생성자 2번 호출 문제 final 키워드 클래스, 메서드 사용 불가 1. 대상 클래스에 기본 생성자 필수 CGLIB는 구체 클래스를 상속 받는다. 자바 언어에서 상속을 받으면 자식 클래스의 생성자를 호출할 때 자식 클래스의 생성자에서 부모 클래스의 생성자도 호출해야 한다. (이 부분이 생략되어 있다면 자식 클래스의 생성자 첫줄에 부모 클래스의 기본 생성자를 호출하는 super() 가 자동으로 들어간다.) 이 부분은 자바 문법 규약이다. CGLIB를 사용할 때 CGLIB가 만드는 프록시의 생성자는 우리가 호출하는 것이..
JDK 동적 프록시를 사용하면서 의존관계 주입을 할 때 어떤 문제가 발생하는지 코드로 알아보자. 1. ProxyDIAspect, Test @Slf4j @Aspect public class ProxyDIAspect { @Before("execution(* hello.aop..*.*(..))") public void doTrace(JoinPoint joinPoint){ log.info("[proxyDIAdvice] {}", joinPoint.getSignature()); } } @Slf4j @SpringBootTest(properties = {"spring.aop.proxy-target-class=false"}) //jdk 동적 프록시 @Import(ProxyDIAspect.class) public clas..
JDK 동적 프록시와 CGLIB를 사용해서 AOP 프록시를 만드는 방법에는 각각 장단점이 있다. JDK 동적 프록시는 인터페이스가 필수이고, 인터페이스를 기반으로 프록시를 생성한다. CGLIB는 구체 클래스를 기반으로 프록시를 생성한다. 물론 인터페이스가 없고 구체 클래스만 있는 경우에는 CGLIB를 사용해야 한다. 그런데 인터페이스가 있는 경우에는 JDK 동적 프록시나 CGLIB 둘중에 하나를 선택할 수 있다. 스프링이 프록시를 만들때 제공하는 ProxyFactory 에 proxyTargetClass 옵션에 따라 둘중 하나를 선택해서 프록시를 만들 수 있다. proxyTargetClass=false --> JDK 동적 프록시를 사용해서 인터페이스 기반 프록시 생성 proxyTargetClass=true..