일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 컴퓨터시스템
- AutoConfiguration
- ApplicationContext
- 링커
- DispatcherServlet
- FunctionalInterfaces
- ORM
- hibernate
- exception
- 프록시
- 링킹
- gradle
- Immutable
- JPA
- Kotlin for Java Developers
- 클린코드
- String
- beanfactory
- springboot
- IOC
- springwebmvc
- java
- 토비의스프링
- Spring
- 토비의스프링3.1
- 메이븐
- 빌드툴
- DesignPattern
- 자바
- lambda
- Today
- Total
목록프로그래밍 (78)
엔지니어로 가는 길
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dEaP4Y/btqISwi2A54/bzvDxEAectKVyioFTIwQ3k/img.png)
PathVariable로 LocalDate 꼴의 문자열을 LocalDate 타입의 객체로 받는 메소드를 만들고 싶었다. 테스트 코드를 작성하였다. 결과는 실패. 메소드 인자 타입이 맞지 않아서 문제가 되었다고 하니 String을 LocalDate 타입으로 변환해주는 게 default로 설정되어있지는 않은가 보다. LocalDate 타입 정도는 등록되어있을 줄 알았기 때문에 살짝 당황했다. 그래서 Formatter를 만들었다. Formatter 만들어 등록하면 String과 Object 간의 변환이 가능해지기 때문이다. Spring boot를 이용할 경우 Formatter를 bean으로만 등록해주면 알아서 등록이 이루어진다. 근데 테스트가 또 깨졌다. 같은 이유로 말이다. Formatter가 제기능을 못했..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cflogS/btqIuLm5jZy/Ay62mdG1Nd0064KahLkifK/img.png)
Error java.lang.Error 클래스의 서브 클래스들이 해당된다. 에러는 시스템에 뭔가 비정상적인 상황이 발생했을 경우 사용된다. 그래서 주로 JVM에서 발생시킨다. 애플리케이션 코드는 에러를 잡으려고 하면 안 된다. 아무런 대응 방법이 없기 때문이다. Exception java.lang.Exception 클래스와 그 서브클래스들이 해당된다. 에러와 달리 애플리케이션 코드의 작업 중 예외상황이 발생했을 경우 사용된다. Exception 클래스는 체크 예외와 언체크 예외로 구분되는데, 전자는 RuntimeException을 상속하지 않은 것들이고, 후자는 상속한 클래스들을 말한다. Checked Exception(체크 예외) 일반적으로 예외라고 하면 Exception 클래스의 서브클래스 중에서 R..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/zj6eK/btqIvYep46a/TcnLUYeOHb2MrDI2ub8sKk/img.png)
JAVA SE 8 이후의 Annotations 1. Type Annotations and Pluggable Type Systems 자바8 이전에는 어노테이션이 declarations에만 적용될 수 있었다. 하지만 자바8부터 어노테이션이 type use에도 적용될 수 있다. 다시 말해, 타입을 사용하는 곳이면 어디든 어노테이션을 사용될 수 있다는 뜻이다. Class instance creation expression: Type cast: Implements clause: Thrown exception declaration: 이러한 형태의 어노테이션을 타입 어노테이션이라 부른다. 타입 어노테이션은 analysis of java code를 향상시키고 더 강한 type checking을 보장할 수 있다. 특징 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qQ2ns/btqH8bx0i9a/XgYvW4dt40j0WHneSVJ0mk/img.png)
출처: http://docs.oracle.com/javase/tutorial/java/annotations/ annotate add notes to (a text or diagram) giving explanation or comment. 어노테이션이란 메타데이터의 형식으로 프로그램에 대한 데이터(이는 프로그램의 일부는 아니다)를 제공한다. 어노테이션은 가리키는 코드의 동작에 직접적인 영향을 미치지는 않는다. 어노테이션의 용도 컴파일러을 위한 정보 제공 어노테이션은 에러를 잡아내거나 경고를 무시하기 위해 컴파일러에 의해 사용될 수 있다. 컴파일 타임, 개발 타임 처리 소프트웨어 도구는 코드, xml 파일 등을 생성하기 위해 어노테이션 정보를 이용할 수 있다. 런타임 처리 일부 어노테이션은 런타임에 사용될..
http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html 우리는 컴퓨터로 조종하는 자동차 소프트웨어 프로그래머다. 우리는 자동차를 조종하는데 사용하는 메소드를 가진 인터페이스를 만들었고 잘 사용중이다. 근데 만약 자동차에 새로운 기능을 추가해야 한다면 어떨까? 그냥 기존의 인터페이스에 메소드를 추가하면 될까? 기존의 인터페이스에 메소드를 추가하면, 인터페이스를 구현한 클래스도 수정해야만 한다. 인터페이스를 구현하는 클래스는 abstract 클래스가 아닌 이상, 인터페이스의 모든 메소드를 구현해야만 하기 때문이다. static 메소드로 추가한다면, 동료들이 새로운 메소드를 필수적인 메소드가 아니라 유틸리티성 메소드로 여길지 모른다. 이럴 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/btMZfA/btqHnkijS3O/PKIyzKct7Wa1jKoWyE1XC1/img.png)
@RequestParam 또는 @PathVariable로 들어온 값을 객체로 받으려면 Formatter가 필요하다. String 타입 변수 name을 갖는 Person 클래스가 있다. 컨트롤러에서 위와 같이 name을 String이 아니라 바로 Person 객체로 받고 싶다고 해보자. 테스트를 돌리면 MethodArgumentConversionNotSupportedException가 발생한다. 매우 직관적인 이름이다. 컨트롤러의 인자로 Person 타입을 받겠다고 했는데 실제로 주어진 것은 String 타입이었다. String이 Person으로 conversion되지 않아서 예외가 발생한 것이다. 이렇게 Formatter를 등록(spring boot는 Formatter를 따로 등록할 필요 없이 빈으로만 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/9XdAc/btqG5ZG3ggR/OSTBRVTTPRGEYFLN3EHMK1/img.png)
컴퓨터가 C언어를 이해할 수 있을까? 요즘은 프로그램을 소스 코드로 작성한다. 소스 코드는 인간이 이해할 수 있는 언어로 작성한 코드이다. 시스템은 소스 코드를 이해할 수 없다. 시스템은 기계어만 이해할 수 있다. 따라서 누군가 소스 코드를 기계어로 번역해주어야 한다. (C언어의 경우) 컴파일러와 어셈블러가 번역 과정을 맡는다. 먼저 컴파일러가 소스 코드를 어셈블리어로 번역해놓고 나면, 어셈블러가 어셈블리어를 기계어로 번역한다. 소스 코드를 한 번에 기계어로 번역해주지 않고 왜 굳이 두 단계로 나누었을까라는 의문이 들었다. 하지만 만들어진 순서를 생각해보면 당연한 결과인 것 같다. 프로그래밍 언어의 시작부터 사람이 이해할 수 있는 언어가 있었던 것이 아니라, 처음엔 기계어에서부터 시작했다. 기계어는 0과..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dmZ8Ui/btqGRRucYo0/zKNQ6nbYCWK7UfJqdRQV5K/img.png)
Common Gateway Interface(CGI)란 서버와 애플리케이션 간에 데이터를 주고 받는 방식 또는 컨벤션을 CGI라고 한다. 아래 그림을 참고하자. 유저가 웹페이지를 요청했을 때 서버는 요청된 페이지를 보내준다. 하지만 유저가 웹페이지에서 특정 form을 채운 뒤 웹페이지를 보내면 이는 보통 애플리케이션에 의해 처리되어야 한다. 웹서버는 보통 form 정보를 처리해줄 애플리케이션 프로그램에 정보를 보내고, confirmation 메시지를 돌려준다. 예를 들어, 회원가입 정보라면 서버는 이 정보를 애플리케이션에 보내 회원가입 관련 로직이 수행되도록 할 것이고, 애플리케이션은 회원가입 로직을 수행한 뒤 결과를 서버에 다시 보내줄 것이다. 이렇게 서버와 애플리케이션이 소통할 때 CGI 기반으로 만..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/beoonS/btqFpBfZMDK/kZQa8OKLs7kU1KigVO2dK0/img.png)
웹 환경에서 스프링 애플리케이션의 동작 방식 스프링 웹 애플리케이션도 결국 스프링 애플리케이션이므로 빈을 생성하고 관리해줄 IoC 컨테이너가 필요하다. 이때 사용되는 IoC 컨테이너가 바로 WebApplicationContext로, 이름 그대로 웹 환경에서 사용할 때 필요한 기능이 추가된 ApplicationContext이다. 웹 환경에서 스프링 애플리케이션의 동작 방식을 이해하려면, 우선 일반적인 스프링 애플리케이션의 동작 방식을 이해해야 한다. 일반적인 스프링 애플리케이션은 IoC 컨테이너가 빈 설정 메타 정보를 이용해서 빈 객체들을 만들고 DI(의존성 주입)를 수행한 후에 최초로 애플리케이션을 기동할 빈 하나를 제공해줌으로써 (마치 자바 애플리케이션에서 main() 메소드를 호출하듯) 동작한다. 스..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cS6lvy/btqFpLbn4UE/OEXofjyVdgAjJkZB9LFKU0/img.png)
스프링 애플리케이션의 동작 방식 스프링 IoC 컨테이너는 빈(Bean) 설정 메타정보를 이용하여 빈 객체(Object)를 만들고 DI(Dependency Injection) 작업을 수행한다. 하지만 이것만으로는 애플리케이션 동작하지 않는다. 자바 애플리케이션의 main() 메소드처럼 어디에선가 특정 빈 오브젝트의 메소드를 호출함으로써 애플리케이션을 동작시켜야 한다. 즉, 적어도 한 번은 위의 예와 같이 IoC 컨테이너에게 요청하여 빈 객체를 가져와야 하는데, 이때는 반드시 getBean()이라는 메소드를 사용해야 한다. 그러나 그 이후로는 다시 getBean()으로 빈 객체를 가져올 필요가 없다. 빈 객체들끼리 DI로 서로 연결되어 있으므로 의존관계를 타고 필요한 객체가 호출되면서 애플리케이션이 동작하기..