일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 링킹
- springboot
- DesignPattern
- exception
- 빌드툴
- 토비의스프링
- hibernate
- ApplicationContext
- FunctionalInterfaces
- java
- lambda
- springwebmvc
- beanfactory
- IOC
- ORM
- JPA
- Spring
- Kotlin for Java Developers
- 컴퓨터시스템
- 자바
- 프록시
- gradle
- 링커
- String
- 메이븐
- Immutable
- AutoConfiguration
- 클린코드
- DispatcherServlet
- 토비의스프링3.1
- Today
- Total
목록프로그래밍 (78)
엔지니어로 가는 길
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bc0tzn/btqCrOB5uqL/1aBGmWpZUkoAwYtxKVH7EK/img.jpg)
이 글에서는 DispatcherServlet에 대해 알아볼 것이다. DispatcherServlet Spring MVC는 다른 웹 프레임워크와 마찬가지로 front controller(?) 패턴으로 설계되었다. DispatcherServlet란 Spring MVC에서의 front controller 역할을 하는 서블릿이다. 즉, DispatcherServlet이라는 서블릿이 전면에서 모든 요청을 받은 뒤 각각의 요청을 처리하는 적절한 곳으로 뿌려준다. (front controller(!) 패턴이란 문지기를 세워 모든 요청이 문지기를 통해서 전달되도록 설계하는 방법이다.) DispatcherServlet도 하나의 서블릿이다. 따라서 다른 어떤 서블릿과 마찬가지로, 자바 설정이나 web.xml에 있는 설정에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dOZ2bo/btqBOraLiv2/hkbRpmHhnBcPlPuDKcVB2k/img.png)
https://www.youtube.com/watch?v=ESwVlixFtak primitive 타입이 아니라 사용자 정의 객체인 경우 어떤 객체가 더 큰지 사용자가 기준을 명시해주어야 한다. Java에서는 이를 위해 Comparable이라는 interface를 지원한다. 즉, 사용자 객체가 Comparable interface를 구현하고 있으면 그 객체는 마치 primitive 타입처럼 비교 기준이 세워져있음을 뜻하므로 Java API가 제공하는 정렬 기능을 사용할 수 있다. 예를 들어 Fruit이라는 객체가 이름과 재고라는 두 가지 필드를 가지고 있고, Comparable을 구현하여 compareTo를 이름이 더 빠른 것이 더 크다고 재정의했다면 Fruit 배열이 있을 때 Arrays.sort에 Fr..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cMHvvc/btqBQ1oeCYA/xx4scsxgUdpVyD4jn4oAzk/img.png)
ConcurrentModificationException와는 초면이다. 예외가 발생한 위치와 예외의 이름으로부터 이 예외가 언제 발생하는지 짐작할 수 있었다. 예외를 발생시킨 코드는 아래와 같다. 구글링해보니 아래와 같은 설명이 있었다. 아래의 두 코드는 순서대로 "How to avoid java.util.ConcurrentModificationException when iterating through and removing elements from an ArrayList"라는 제목의 글에 있는 질문자의 코드와 답변자의 코드이다. 내 코드에서 Docs 역시 ArrayList였으므로 위의 코드처럼 수정해보았더니 exception을 피할 수 있었다.
A라는 클래스를 예로 들어보자. 1. new 연산자 이용 A a = new A(); 2. Class 클래스 이용 Class clazz = Class.forName("me.jackjack.A"); A a = clazz.newInstance(); (Class라는 클래스에 forName 메소드 인자로 클래스의 정보를 넘겨 생성) A.class.newInstance(); (클래스 이름을 이용하여 생성) A a = new A(); a.getClass().newInstance(); (객체(인스턴스) 이름을 이용하여 생성) 2번째 방법을 이용하면 인터페이스를 이용할 때 소스코드의 수정 없이 설정 파일을 수정하는 것만으로 부품을 갈아 끼울 수 있다. 참고자료
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bvtDyD/btqBqijoBzF/ZhFkGjKUCaZOaYf1VmJfZ1/img.png)
Enum의 정의 Enum(enumerated type): 열거형, 서로 연관된 '상수'들의 집합 상수 상수란 변하지 않는 수를 뜻한다. Enum도 클래스 변수와 메소드, 생성자를 가질 수 있다. 위의 코드는 아래의 코드와 같은 역할을 한다. 즉, Fruit에서 단순히 APPLE, PEACH, BANANA라고 나열했을 뿐인데 이름이 각각 APPLE, PEACH, BANANA인 Fruit 타입의 객체(instance)가 생성되는 것이다. Enum은 서로 연관된 '상수'들의 집합이라고 했는데 웬 객체인가? 객체들을 보면 final이라는 키워드가 붙어 있다. 즉, 초기화 된 이후에 변경이 불가능하다는 뜻이다. 따라서 이들은 앞으로 변하지 않음으로 상수라고 할 수 있다. Enum의 특징 Enum의 생성자는 반드시..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bqR1eu/btqBkpLpRUM/Tnf3a0p554hJC3rQLfD9b0/img.png)
TCP 방식으로 데이터를 주고받게 하기 위해 아래와 같이 Server 클래스와 Client 클래스를 만들었다. Server class ServerSocekt Socket BufferedReader PrintWriter Client class Socket BufferedReader PrintWriter 한 쪽에서 다른 한 쪽으로 PrintWriter의 println 메소드를 통해 문자열을 보냈는데 이상하게 제대로 전달이 이루어지지 않았다. 문제는 둘 중 하나다. PrintWriter의 println에 문제가 있거나, BufferedReader의 readLine에 문제가 있거나. PrintWirter의 println을 무한반복으로 시도해보았는데 이때는 정상적으로 전달받았다. 따라서 BufferedReader..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cDxlTm/btqARXPapbe/dqmKxVuAk7iTWoK2X8aLW1/img.png)
이번 시간에는 정적 링킹과 동적 링킹의 차이에 대해 이해해보자. 아래의 그림에서 왼쪽은 정적 링킹 방식이고 오른쪽은 동적 링킹 방식이다. 먼저 글을 찬찬히 읽은 뒤 다시 그림을 살펴보는 것이 좋겠다. Static Linking (정적 링킹) 정적 링킹이란 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하는 방식을 말하며 링커에 의해 이루어진다. 즉, 자신이 작성한 프로그램에서 A라는 외부 함수를 사용했다면, A라는 외부 함수에 대한 정보를 자신이 작성한 프로그램의 실행파일을 만들 때 복사해온다. 5개의 프로그램에서 A라는 외부 함수를 이용하는데 이때 정적 링킹 방식을 사용하면 5개의 프로그램의 실행 가능한 목적파일 각각에 A의 정보가 담긴다. 즉, 중복이 발생한다. 따..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TRuUm/btqAQ3WDIvY/gJQM8qJrUQiEEpZbjOlxFK/img.png)
이번에는 링킹이 무엇인지, 링커란 무엇인지에 대해 간략히 알아보도록 한다. Linking(링킹)은 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고 실행될 수 있는 한 개의 파일로 만드는 작업이다. 이 파일이 메모리에 로딩되어 실행된다. 링크는 컴파일시에 수행되는 경우도 있고, 로딩시에 수행되는 경우도 있고, 실행시에 수행되는 경우도 있다. Linker(링커)란 링킹을 담당하는 프로그램이다. 링커는 소프트웨어 개발에서 독립적인 컴파일을 가능하게 하는 아주 중요한 역할을 담당한다. 링커 덕분에 큰 규모의 응용프로그램을 한 개의 소스 파일로 구성하는 대신 별도로 수정할 수 있고, 컴파일할 수 있는 보다 관리할 만한 규모의 더 작은 모듈들로 나눌 수 있다. 즉, 아주 거대한 프로그램을 하나의..