일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- gradle
- springwebmvc
- 빌드툴
- 프록시
- 링킹
- 토비의스프링3.1
- Kotlin for Java Developers
- Spring
- String
- 자바
- Immutable
- lambda
- JPA
- ApplicationContext
- 클린코드
- 링커
- 메이븐
- java
- 컴퓨터시스템
- 토비의스프링
- DesignPattern
- AutoConfiguration
- FunctionalInterfaces
- DispatcherServlet
- ORM
- beanfactory
- exception
- IOC
- hibernate
- springboot
- Today
- Total
목록프로그래밍 (78)
엔지니어로 가는 길

ddl-auto가 언제 적용되는지 알아보고, 이를 테스트해봄으로써 ddl-auto 옵션이 제대로 동작하지 않는 문제를 해결해보자. * 이제부터 편의상 hibernate.hbm2ddl-auto를 ddl-auto라고 부른다. ddl-auto 옵션이 적용되는 시점 ddl-auto 옵션은 Hibernate의 SchemaManagementTool이 관리한다. 그런데 SchemaManagementTool은 SessionFactory 라이프사이클의 일부로, SessionFactory가 생성되거나 종료될 때 자동으로 동작한다. 다시 말해, ddl-auto 옵션이 적용되는 시점은 SessionFactory가 생성되거나 종료되는 시점이다. 애플리케이션이 실행됐더라도, SessionFactory가 생성되기 전이라면 ddl-..

ORM이란 무엇인가 Object-relational mapping, ORM은 객체와 관계형 데이터베이스 사이에 존재하는 패러다임 불일치를 해소해준다. '패러다임 불일치'라는 어려운 단어 속에 많은 것이 압축되어 있다. 하나씩 살펴보자. 패러다임 불일치 객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 서로 다르다. 따라서 객체를 관계형 데이터베이스에 저장할 때, 관계형 데이터베이스에 있는 데이터를 객체로 가져와 조작하고 싶을 때 문제가 발생하고 이 문제는 개발자가 (ORM이 없다면 더 많은) 시간과 비용을 들여 해결해야 한다. 패러다임 불일치의 예를 살펴보자. 상속 객체 세상에는 상속이라는 개념이 존재한다. 테이블은 상속이라는 개념이 없다. 상속 관계의 객체를 저장하기도..

많은 경우 component scan을 통해서 자동으로 빈 등록이 이루어지지만 때로는 직접 @Bean 어노테이션을 통해 빈으로 등록해야할 때가 있다. @Bean 어노테이션을 통해 빈으로 등록할 때 주의해야 할 점에 대해 살펴본다. @Configuration 클래스와 @Bean 먼저 @Configuration 어노테이션이 붙은 설정 전용 클래스 안에서 @Bean 어노테이션을 통해 빈으로 등록하는 경우이다. @Bean이 붙은 메소드는 기본적으로 싱글톤이기 때문에 여러 번 호출돼도 하나의 객체만 리턴되는 것이 보장된다. 보통의 클래스라면 메소드가 이렇게 동작하지 않는다. 정직하게 작성된 대로 동작한다. 코드가 new MyBean()이라고 적혀 있으면, 호출될 때마다 객체가 생성된다. 따라서 @Configura..

@InitBinder @Controller나 @ControllerAdvice가 붙은 클래스는 @InitBinder가 붙은 메소드를 가질 수 있다. 이는 WebDataBinder라는 인스턴스를 초기화하는 메소드이다. WebDataBinder 1. 요청 매개변수(form 또는 query 데이터)를 모델 객체에 바인딩한다. Thymeleaf는 익숙하지 않기 때문에 다 이해할 수는 없지만 확실한 것은 owner와 관련된 정보를 input 태그를 이용하여 사용자로부터 입력받고 있다는 것이다. 사용자가 입력을 마치고 submit을 누르면 post 요청이 될 것이고 이걸 아래의 OwnerController의 메소드에서 잡을 것이다. processCreationForm 메소드에 Owner 타입의 인자가 있다. Owne..
1. 소통 경청해야 한다. 문제를 푸는 것에 몰두한 나머지 면접관과의 커뮤니케이션에 소홀하지 않도록 하자. 합의한 것은 지켜야 한다. 문제를 풀 때 면접관과 합의 하에 어떤 방식으로 구현하기로 했다면, 합의한 방식대로 이끌어나가야지 도중에 말도 없이 자신이 처음 생각한 방식대로 푸는 것은 별로 좋지 않다. 머릿 속에서 일어나는 일을 알리는 게 좋다. 문제를 푸는 과정, 예를 들면 BFS를 하는지 DFS를 하는지, 그것을 고른 이유는 무엇인지를 말하면서 문제를 푸는 게 좋다. 2. 진정성 내가 이 포지션을 얼마나 중요하게 여기고, 진지하게 임하고 있는지를 보여주자. 예를 들면 복장, 시선, 면접관을 대하는 태도(미래의 팀원을 대하듯 존중하는 태도를 갖추는 게 좋다), 말투, 질문 등에서 비춰질 수 있다. ..

빈을 생성하는 방법: 리플렉션 + 디폴트 생성자 스프링의 빈은 기본적으로 클래스 이름과 프로퍼티로 정의된다. 스프링은 내부적으로 리플렉션 API를 이용해서 빈 정의에 나오는 클래스 이름을 가지고 디폴트 생성자를 통해 빈 오브젝트를 생성한다. 클래스의 이름만 알고 있어도 다음과 같이 리플렉션을 통해 오브젝트를 생성할 수 있다. 이외에도 빈을 만들 수 있는 여러 방법이 있는데 그중 하나인 FactoryBean에 대해 살펴보자. 빈을 생성하는 방법: FactoryBean FactoryBean이란 스프링을 대신해서 오브젝트의 생성 로직을 담당하도록 만들어진 특별한 빈이다. FactoryBean을 통해 빈을 생성하는 방법을 살펴보기 전에 어떤 경우에 FactoryBean을 써야 하는지 생각해보자. 클래스 정보를 ..

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 등을 가질 수 있는데 그냥..

우리는 편의상 메모리를 단순히 바이트들의 선형 배열로 여기고, CPU가 각 메모리 위치에 상수 시간 안에 접근할 수 있다고 생각한다. 하지만 실제 메모리는 조금 복잡하다. 메모리 계층구조 메모리는 다음과 같이 계층구조를 갖는다. 메모리는 왜 계층구조일까? 우리는 속도가 빠르면서 용량이 큰 메모리를 원한다. 속도와 용량은 trade-off 관계에 있다. 속도를 빠르게 하면 용량이 떨어지기 마련이고, 용량을 키우면 속도가 떨어지기 마련이다. 그러나 계층구조를 이용하면 속도도 빠르고 용량도 큰 마법같은 메모리를 사용하는 것 같은 착각을 얻을 수 있다. 이게 어떻게 가능한걸까? 먼저 캐시와 지역성을 이해해야 한다. 캐시 '캐싱한다'는 말이 있다. 이 말은 무언가를 저장한다는 말이고, 그 무언가는 당연히 앞으로 ..

Converter Converter란 객체를 다른 객체로 변환해주는 일을 한다. 예를 들어, Spring boot에서 문자열을 과일이라는 객체로, 과일이라는 객체를 문자열로 변환하고 싶다면 다음과 같은 Converter를 빈으로 등록해주어야 한다. DomainClassConverter DomainClassConverter도 Converter인데 이름에서 알 수 있듯 도메인 객체를 다른 객체로, 또는 다른 객체를 도메인 객체로 변환해주는 일을 한다. Spring data jpa를 사용하면 DomainClassConverter가 자동으로 등록된다. Spring MVC 컨트롤러에서 매우 유용하게 사용할 수 있다. 위의 예시를 보면 showuserFrom 핸들러는 @PathVariable을 통해 url에 있는 ..