싱글톤(Sigleton) 싱글톤 패턴은 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 그렇기 때문에 private 생성자를 사용해서 외부에서 new 키워드로 객체를 2개 이상 생성하지 못하도록 막아야 한다. 싱글톤 컨테이너(Sigleton Container) 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다. 스프링 컨테이너의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다. 싱글..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bWrHL1/btrroFJyEgV/n8g2lpSekgoGAkyCT4KxeK/img.png)
Bean Validation Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준이다. 쉽게 이야기해서 검증 애노테이션과 여러 인터페이스의 모음이다. 마치 JPA가 표준 기술이고 그 구현체로 하이버네이트가 있는 것과 같다. Bean Validation을 구현한 기술중에 일반적으로 사용하는 구현체는 하이버네이트 Validator 이다. 이름이 하이버네이트가 붙어서 그렇지 ORM과는 관련이 없다. 의존관계 추가 Bean Validation을 사용하려면 build.gradle에 의존관계를 추가해야 한다. implementation 'org.springframework.boot:spring-boot-starter-validation..
Interceptor 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다. 인터셉터의 흐름은 다음과 같다. HTTP 요청 ->WAS-> 필터 -> 디스패처 서블릿 -> 스프링 인터셉터 -> 컨트롤러 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다. 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다. 아래는 인터셉터로 제한을 적용했을 때, 흐름이다. HTTP 요청 -> WA..
JPA를 이용하여 개발하다보면 아래와 같은 에러를 마주치곤 한다. Null value was assigned to a property ~~~ of primitive type setter of 이유 하이버네이트는 내부적으로 setter메소드를 사용해서 조회 결과와 객체(Dto 또는 Entity)를 mapping하게 되는데, 조회 결과의 null값을 primitive 타입의 변수에 저장하려 할 때 발생하는 것이다. 해결 방법 위 문제는 아래와 같은 방법으로 해결할 수 있다. 매핑될 변수를 reference타입으로 변경 DB에 default 값 할당
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/MSKSC/btrq6ZUHQX4/aqaK3W0iaP2S0sjJGMPiok/img.png)
준영속 상태 준영속 상태란, 영속상태의 엔티티가 영속성 컨텍스트에서 분리된 것이다. 준영속 상태가 되면 영속성 컨텍스트가 제공하는 기능(dirty checking)을 사용하지 못한다. 준영속 상태로 만드는 방법 em.detach(entity) 특정 엔티티만 준영속 상태로 전환한다. Member findMember = em.find(Member.class, 2L); // 현재 member의 name은 hello이다. findMember.setName("hyuuny"); // findMember를 준영속 상태로 변경한다. em.detach(findMember); System.out.println("member : " + findMember); tx.commit(); findMember의 name을 "hyuu..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bK9c0W/btrq11GjDPh/hyJop8448796K5O6jLKgpK/img.png)
플러시(flush 플러시(flush)는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다. 데이터베이스 transaction commit이 발생하면 자동 플러시(flush)가 발생한다. 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 것이지 영속성 컨텍스트를 비우는 것은 아니다. transaction이라는 작업 단위가 있기 때문에 플러시(flush)가 동작 가능한것이다. 플러시(flush) 발생 플러시(flush)가 발생하면 다음과 같은 일이 발생한다. 1. 변경 감지(Dirty checking) 발생 2. 수정된 엔티티의 내용을 쓰기 지연 SQL 저장소에 등록 3. 쓰기 지연 SQL 저장소의 query를 데이터베이스에 전송(등록, 수정, 삭제) 영속성 컨텍스트 플러시(flus..
영속성 컨텍스트 영속성 컨텍스트란, 엔티티를 영구 저장하는 환경이라는 뜻이다. EntityManager의 persist()를 사용하여, Entity를 DB에 저장하고 영속성 컨텍스트로 관리한다. 이러한 영속성 컨텍스트는 논리적인 개념이기 때문에 눈에 보이지 않고, EntityManager를 통해서 접근한다. 엔티티의 생명주기 엔티티의 생명주기는 다음과 같이 총 4단계로 구성된다. 비영속(new/transient) 비영속이란, 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태를 말한다. // 객체만 생성하였으므로, 비영속 상태 Member member = new Member(); member.setEmail("shyune@knou.ac.kr"); member.setUsername("hyuuny"); 영속(m..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ck4Zbw/btrq7TNRJeb/FgpYoEKKvAfdijNkB5ZM5k/img.jpg)
주석은 나쁜 코드를 보완하지 못한다. 표현력이 풍부하고 깔끔하여 주석이 거의 없는 코드가, 복잡하고 어수선하며 주석이 많이 달린 코드보다 훨씬 좋다. 코드로 의도를 표현하라 코드로 대다수 의도를 표현할 수 있다. 많은 경우 주석으로 달려는 설명을 함수로 만들어 표현해도 충분하다. //직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) 주석이 없음에도 아래쪽 코드로 의도를 표현할 수 있다. if (employee.isEligibleForFullBenefits()) 좋은 주석 어떤 주석은 필요하거나 유익하다. 법적인 주석 각 소스 파일 첫머리에 주석으로 들어가는 저작권 정보와 소유권 정보는 필요하고도 타..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/6EuEp/btrq5oVhUPP/8si2lkdFqmjM6nEAmYYr2K/img.jpg)
의미있는 이름 의도를 분명히 밝혀라 변수(혹은 함수나 클래스)의 존재 이유는? 수행 기능은? 사용 방법은? int d; //경과 시간(단위: 날짜) 이름 d는 아무 의미도 드러나지 않는다. 경과 시간이나 날짜라는 느낌이 안 든다. 측정하려는 값과 단위를 표현하는 이름이 필요하다. int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeIndDays; 의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.그릇된 정보를 피하라 hp, aix, sco는 변수 이름으로 적합하지 않다. 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름이기 때문이다. 실제 List가 아니라면, accountList라 명명하지 않는다...
의존성 주입 DI는 디자인 패턴으로 크게 다음과 같이 4가지 방법이 있다. 생성자 주입 setter 주입 필드 주입(@Autowired) 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법 생성자 호출 시점에 단 1번만 호출되는 것이 보장된다. 불변, 필수 의존 관계에 사용 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepos..
- Total
- Today
- Yesterday
- Real MySQL
- 리팩토링
- 북클럽
- 노마드
- spring boot
- 파이썬
- 노마드코더
- 코테
- 스프링부트
- 스프링
- 릿코드
- 자료구조
- 알고리즘
- 데이터베이스
- 그리디
- MySQL
- webflux
- 백준
- 코틀린
- leetcode
- Algorithm
- 인프런
- kotlin
- 김영한
- 구현
- Spring
- 정렬
- 스프링 부트
- mysql 8.0
- 문자열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |