일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ApplicationContext
- 링킹
- springwebmvc
- 토비의스프링3.1
- String
- JPA
- 자바
- springboot
- AutoConfiguration
- 빌드툴
- 클린코드
- beanfactory
- 프록시
- ORM
- 토비의스프링
- 링커
- DispatcherServlet
- DesignPattern
- exception
- FunctionalInterfaces
- IOC
- gradle
- Immutable
- hibernate
- 컴퓨터시스템
- lambda
- Kotlin for Java Developers
- 메이븐
- java
- Spring
- Today
- Total
목록프로그래밍/Java (31)
엔지니어로 가는 길
최근에 지인에게 예외가 뭐냐는 질문을 받았다. 코드에서 예외를 다루는 건 익숙한데 예외에 대해 설명하려니 긴가민가한 부분이 있었다. ‘예외랑 에러랑 어떻게 다르더라? 예외는 이름에서 알 수 있듯 예외적인 상황과 관련이 있는데, 어디선가 예외도 정상 플로우라고 들었던 것 같은데 핸들링하고 있는 예외는 정상 플로우로 보는 거였나?’ 아래의 글에서 토비의 스프링을 읽으며 Checked exception과 Unchecked exception에 대해 간략히 정리한 적이 있는데, 이번에는 오라클 문서를 읽으며 예외가 무엇인지 기본 개념에 대해 정리해보려고 한다. JAVA Error와 Checked/Unchecked Exception Error java.lang.Error 클래스의 서브 클래스들이 해당된다. 에러는 ..
아래 두 개의 글에 이어 이번이 세 번째 String 관련 글인 것 같다. Java String으로 보는 동일성과 동등성 Java StringBuilder를 쓰는 이유 Java String은 왜 불변일까? 불변이기 때문에 얻을 수 있는 장점에 대해 알아보자. 장점 1. 안전 Immutable이기 때문에 안전하다. 몇 개의 예시를 살펴보자. 1. 여러 참조 변수가 같은 String 객체를 참조하고 있다고 하더라도 안전하다. String 객체를 누가 조작할 수가 없기 때문이다. 2. String 객체를 이리저리 전달할 때 원본 String 객체가 저장된 주소 자체를 넘겨도 안전하다. 전달받은 곳에서 원본 값을 직접 읽을 순 있으나 조작할 수는 없기 때문이다. 장점 2. 성능 및 효율 Immutable은 안전..
Shallow copy 얕은 복사(shallow copy)는 객체가 아닌 객체를 참조하는 참조변수(객체의 주소)만 복사한다. fig3에서는 얕은 복사 방법 세 가지가 보인다. 1. 하나는 Object의 clone() 메소드 (Object의 clone() 메소드를 사용하기 위해서는 대상 클래스에서 clone() 메소드를 오버라이드 해야 하지만 얕은 복사는 객체가 복사되는 것이 아니므로 대상 클래스가 clone() 메소드를 오버라이드 하지 않아도 된다.) 2. 대입연산자 = 3. System의 arraycopy() 메소드(보다 효율적으로 얕은 복사 수행) 얕은 복사를 통해 복사되는 것은 참조변수(객체의 주소)뿐이므로 얕은 복사를 통해 만들어진 copy와 persons는 같은 Person 객체를 가리키고 있다..
영어로 된 문서를 읽을 때 자주 등장하는 단어가 있다. 단어의 뜻을 그대로 가져온 것이 아니라 자바에서 '이런 것을 이렇게 부르자'하고 정한 것이기 때문에 사전을 참고해도 잘 이해되지 않는다. 그런 단어 중에서 자주 등장하는 단어 몇 가지를 정리해둔다면 앞으로 문서를 읽고 이해하는데 큰 도움이 될 것이다. Expression Expression은 자바 인터프리터가 evaluate 하는 대상으로, evaluate의 결과 어떤 값이 나온다. Evaluate도 자주 등장하니 알아두는 게 좋다. 사전에 따르면 '평가하다' 정도인데 '풀다, 계산하다'로 생각하는 게 더 이해하기 수월할 것 같다. Expression은 변수, 연산자, 프리미티브 값, 메소드 호출, 다른 expression 등을 가질 수 있는데 그냥..
지난 글에서 프록시란 무엇인지 알아보았고, 간단한 프록시 예제를 하나 살펴보았다. 프록시(Proxy)란 무엇인지 자바 코드로 보자 프록시(Proxy)란 무엇인지 자바 코드로 보자 Proxy Proxy의 사전적 정의는 대리인이다. 자바에서 프록시는 타겟의 기능을 확장하거나 타깃에 대한 접근을 제어하기 위한 목적으로 사용하는 클래스를 말한다. 여기서는 기능을 확장하는 프록시 live-everyday.tistory.com 이번에는 지난 시간의 예제를 발전시켜 자바를 통해 다이나믹하게 프록시를 구현하는 방법을 살펴보도록 한다. '다이나믹하게'라는 뜻은 코드로 일일이 프록시를 만드는 것이 아니라 런타임에 프록시가 생성되는 것을 의미한다. 먼저 왜 다이나믹하게 프록시를 구현해야 하는지 살펴보자. 프록시 구현의 문제..
프록시 Proxy의 사전적 정의는 대리인이다. 자바에서 프록시는 타겟의 기능을 확장하거나 타깃에 대한 접근을 제어하기 위한 목적으로 사용하는 클래스를 말한다. 여기서는 기능을 확장하는 프록시의 예시를 보도록 한다. Hello라는 클래스의 메소드가 대문자로 변환된 문자열을 리턴하게 하고 싶다고 해보자. 이때 프록시를 이용하면 Hello의 메소드를 변경하지 않은 채로 ‘대문자로 변환’이라는 부가 기능을 추가할 수 있다. 여러 구현 방법이 있지만 지금은 프록시의 개념을 이해하는 것이 목적이므로 인터페이스를 통해 간단하게 구현하는 방법을 알아보자. 위와 같이 Hello라는 이름의 인터페이스를 만든다. HelloTarget이라는 클래스를 만들어 Hello를 구현한다. 다음으로 HelloUppercase라는 또 다..
Immutable String은 immutable하다. Immutable이란 변하지 않는다는 뜻이다. 예시를 들어보자. 위와 같이 "Hello"를 담고 있는 str이라는 변수에 "Hello world"를 대입해주면 어떤 일이 벌어질까? "Hello"가 있던 공간에 " world"를 추가하는 것이 아니라 "Hello world"라는 새로운 문자열을 갖게 된다. 정확히는 str이 "Hello"가 있는 메모리 공간을 가리키던 상황에서 "Hello world"가 있는 메모리 공간을 가리키게 된다. (만약 위의 상황에서 String str2 = "Hello world"; 라는 코드를 추가한다면 이때 str2와 str1은 같은 곳을 가리키게 된다. 참고: Java String literal과 new String()..
String literal vs new String() str1을 String literal이라 말한다. str1과 str2는 어떤 차이가 있을까. 위의 그림대로 문자열을 만들어보자 이때 s3와 s4는 같은 곳을 가리키고 있다. String literal은 같은 문자열인 경우 메모리 전체에서 하나만 존재함을 알 수 있다. 하지만 s1과 s2를 보면 같은 문자열임에도 s3, s4가 가리키는 곳과 다른 곳을 가리키고 있고, 심지어 s1과 s2끼리도 서로 다른 곳을 가리키고 있다. 즉, new 연산자를 통해서 String 객체를 만들면 문자열이 같아도 매번 다른 공간에 문자열이 생기는 것임을 알 수 있다. 테스트해보자. 동일성과 동등성 동일할 때와 동등할 때 모두 '같다'라는 단어를 사용할 수 있지만 그 뜻이..
@Embedded와 @Embeddable 다음과 같은 상황을 생각해보자. ToDo class 오늘 할 일 하나를 나타낸다. TDL class to-do-list를 나타낸다. List 타입의 객체를 프로퍼티로 갖는다. 이때 db에 위와 같은 정보를 저장하고 싶다면 어떻게 해야 할까? 가장 먼저 떠올린 방법은 ToDo를 하나의 테이블에 매핑하고, TDL 또한 하나의 테이블에 매핑한 뒤 두 클래스를 One-To-Many와 Many-To-One 관계를 맺게 하는 것이었다. 하지만 생각해보니 ToDo 클래스는 항상 TDL 안에서만 존재하며, TDL을 부르지 않고 ToDo만 불러올 일이 없을 것 같았다. 그래서 ToDo를 TDL의 Embedded로 설정하였다. Embedded로 설정하는 방법은 다음과 같다. ToD..
Modules 모듈은 하나 이상의 패키지를 갖는다. 모듈은 full Java app일 수도, a Java Platform API일 수도 또는 a third party API일 수도 있다. Modules Benefits 1. 군더더기를 제거함으로써 애플리케이션이 알맞은 덩치를 갖게 한다. 프로젝트 Jigsaw(JPMS = Java Platform Module System = Java Jigsaw = Project Jigsaw)의 일환으로 모든 Java Platform API는 별도의 모듈들로 쪼개졌다. 이로써 자신의 어플리케이션에서 필요한(실제로 사용할) 모듈들만 명시할 수 있게(가질 수 있게) 되었다. JPMS가 없는 Java 9 이전에는 모든 Java Platform API들을 애플리케이션에 패키징해야..