본문 바로가기

Development

(45)
스레드 안전성이란? Thread Safe 하게 코드를 작성하라 이 말은 곧 공유되고 변경할 수 있는 상태에 대한 접근을 관리 하는 것과 같다. '공유 되었다'는 것은 '여러 스레드가 특정 변수에 접근할 수 있다'라는 뜻이고 '변경할 수 있다'는 것은 말 그대로 '해당 변수의 값이 변경될 수 있다'는 말이다. 여러 스레드에서 수행되는 작업의 타이밍(race condition)이나 스케줄링에 따른 교차 실행과 관계 없이 불변조건이 유지 되어야 한다. 그러면 어떤 객체가 Thread Safe 해야 해? 이는 '객체가 어떻게 사용되는가?' 의 문제이지 '객체가 어떤 역할을 하느냐'와는 상관없다.다시 말하면 '해당 객체에 여러 스레드가 접근할 가능성이 있는가? '의 문제이다.스레드가 하나 이상의 상태 변수에 접근하고 그 중 하나라도..
@MappedSuperclass 에 관하여 ... @MappedSuperclass 에 관하여 일반적으로, 상속 관계 매핑 전략에서 부모 클래스와 자식 클래스 모두 데이타베이스 테이블과 매핑을 한다. 이와 달리, 부모 클래스를 상속받는 자식클래스에게 매핑 정보만 제공하고 싶을때 이 어노테이션을 사용하면 된다. 엔티티 종류에 상관없이 공통으로 가지고 있어야 하는 정보가 있다면 ( ex. 데이타 생성시간, 수정시간 등 ) 공통 클래스로 추출하고 이를 상속받는 방식으로 구현할 때 사용 한다. 그러나 엔티티는 엔티티만 상속받을 수 있기 때문에 엔티티가 아닌 클래스를 상속받기 위해서 @MappedSuperclass 를 사용한다. 예제 아래 2개의 엔티티를 보자. @Data@Entitypublic class Car extends BaseEntity {​ @Id @G..
빈(bean) 의존관계 설정. 빈 등록방법과 마찬가지로 빈 사이의 의존관계를 설정하는 방법에도 여러가지가 있다. 선정방법에 따른 분류는 아래와 같다.1. 명시적으로 구체적인 빈을 지정.2. 일정한 규칙에따라 자동으로 지정(Autowiring) 메타정보 작성방법에 따른 분류를 하면 아래와 같다.1. XML 태그 / 2. 전용태그 / 3. 애노테이션 / 4. 자바코드에 의한 직접적인 DI이 4가지 방법이, 앞서 말한 선정방법에 따른 분류방식으로 각각 구분할 수 있기 때문에 총 8가지의 빈 의존관계 주입방식이 있다고 보면된다. (빈 등록방식과 의존관계 주입방식이 항상 같을 필요는 없다)넓은 의미에서 DI는, 빈 외에도 단순 오브젝트나 값을 주입하는 것도 포함된다. 지금부터 DI 방식에 대해 알아보자~~~ 1. XML : , 을 이용해 빈을..
빈 설정 메타정보 (Config) 작성 테스트 빈(Bean) 설정 메타정보를 작성하는 방법에는 여러 가지가 있으며, 적당히 조합하여 사용할 수도 있다. 우선 메타 정보는 적절한 Reader 만 있으면 포맷에 상관없이 작성 가능하다.(xml, annotation, java, properties ...) @Setter public class Hello { private String name; private Printer printer; public String sayHello() { return "Hello " + name; } public void print() { this.printer.print(sayHello()); } }public interface Printer { void print(String msg); } public class Stri..
Lazy Exception 과 Hibernate.initialize() 코딩을 하면서 트랜잭션과 관련된 문제는... 보고 당해도 늘 또 당한다... 하이버네이트에서 매핑된 객체를 가져올 때, OneToMany, ManyToMany는 LazyFetch를 기본전략으로 하고 있다. 따라서, 해당 객체를 부모객체가 자식객체를 가지고 올때는, 프락시 객체만 가지고 있으며, 실제 사용하는 시점 DBMS에 쿼리가 날아간다. 그런데 ! ! 부모 객체를 가져오고 세션이 닫힌 뒤, 자식 객체를 콜하게 되면 org.hibernate.LazyInitializationException: could not... 익셉션이 발생 ! 여러가지 해결 방법이 있는데,, 1. Fetch 설정을 Eager로 해주는 가장 단순하고 위험한 방법이 있고,2. DAO 에서 부모객체를 가져올때 Hibernate.Init..
HTTP 메시지 헤더에 대해 조금 더 . . . 헤더 ?메시지 헤더는 특정 종류의 메시지에만 사용할 수 있는 헤더와, 조금 더 범용적인 목적으로 사용할 수 있는 헤더, 그리고 응답과 요청 메시지에서 정보를 제공하는 헤더가 있다 - 일반 헤더 General Header클라이언트와 서버 양쪽 모두가 사용하며, 클라이언트나 서버 혹은 또다른 애플리케이션을 위해 여러 목적으로 사용됨.ex. Date : Tue, 3 Oct 1992 02:14:01 GMT - 대상에게 시간을 알려줌Connection 클라이언트와 서버가 커넥션에 대한 옵션을 정할수 있게 알려줌MIME-Version 발송자가 사용한 MIME 버전Trailer chunked transfer 인코딩으로 "인코딩된 메시지"의 끝부분에 위치한 헤더들의 목록 나열Transfer-Encoding 메시지에 어..
HTTP 메시지 - 메서드 안전한 메서드란 무엇일까 ? 결론과 예를 말하자면, GET과 HEAD는 안전하다고 말할 수 있다. 그 이유는 클라이언트가 서버로 GET, HEAD를 요청 한다고 해서, 서버에서 달라지는 것은 아무것도 없다.즉, Select-조회하여 뿌려주기만하고, 서버 자체의 변화는 아무것도 없다는 것이다. 이를 우리는 안전한 메서드라고 말한다. 이번에는 POST 요청을 했다고 해보자. 클라이언트는 서버로 일련의 데이타들을 보낼 것이고, 그 데이타들은 서버 내에서 어떠한 작용을 한다 ( POST의 목적이므로 )즉 서버 자체에 변화가 일어난 것이다. (결제가 일어난다거나,, 그룹이 생성된다거나 .. ) 안전한 메서드의 목적은, 서버에 영향을 미치는 안전하지 않은 메서드가 사용될 때 사용자들에게 그 사실을 알려주는 HTTP..
3. HTTP 메시지 - 기본 구조 HTTP 메시지란? 텍스트 메타 정보와 데이타로 구분할 수 있다 . HTTP 메시지는 클라이언트의 요청이 서버방향으로 이동하며(인바운드) , 서버에서 처리가 끝난 뒤 결과값을 클라이언트로 리턴해준다(아웃바운드)또한 메시지는 항상 다운스트림으로 흐르며, 발송자는 수신자의 업스트림이다 HTTP 메시지 단순한 데이타의 구조화된 블록이라 할 수 있다. 시작줄 / 헤더 / 바디 이렇게 세 부분으로 이루어진다. - 시작줄 ? Request 시, 메서드와 요청 URL, HTTP version ( GET /exam/help.txt HTTP/1.1 )Response 시, HTTP version, 상태 코드 및 사유 구절 ( HTTP/1.1 200 OK ) - 메서드 ? Request 의 시작줄은 메서드로 시작하며, 기본..