일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- strict stubbing
- custom annotation
- none이미지
- OS
- functional interface
- Thread Library
- 롬복주의점
- 문자열 리터럴
- SystemCall
- 쓰레드 라이브러리
- AOP
- Thread Multiplexing
- Spring
- rainbow table
- task_struct
- 함수형 인터페이스
- FunctionalInterface
- django-crontab
- 프로세스
- 운영체제
- Process
- hiberbate
- @Header
- 도커
- sql-mappler
- ReflectUtils
- python-socketio
- spring-data-jpa
- 문자열 불변성
- java.util.function
- Today
- Total
목록전체 글 (35)
JH's Develog

객체를 저장하는 Service의 유닛 테스트 중 발생한 Strict Stubbing 문제와 해결법에 대한 포스팅입니다. 문제가 발생한 상황 ... @InjectMocks private NoteBookService sut; @Mock private NoteBookRepository noteBookRepository; @Mock private NoteRepository noteRepository; ... @Test void givenNormalNoteBook_whenCreateNoteBook_thenReturnOK(){ //Given NoteBookDto noteBookDto = createNormalNoteBookDto("notebook 1"); User user = createUser("user1"); ..
Spring Security로 JWT 토큰을 사용하면 Authentication 정보를 메서드의 파라미터로 받아올 수 있습니다. 다만 매번 Authentication에서 Principal 정보를 꺼내쓰는 코드를 작성하면 코드의 중복이 심하므로 HandlerMethodArgument를 이용해서 Principal을 바로 메서드의 파라미터로 받아오는 방법을 알아보겠습니다. 0. HandlerMethodArgumentResolver의 구성요소 HandlerArgumentResolver 인터페이스는 두 개의 메서드를 구현해줘야합니다. boolean supportsParameter(MethodParameter parameter); Object resolveArgument(MethodParameter paramete..
Entity를 작성할 때 id나 생성시간, 수정시간과 같은 속성정보는 모든 Entity에 동일하게 추가되는 정보이기 때문에 코드의 중복이 발생합니다. Entity마다 중복되는 컬럼들을 따로 모아서 상속받을 수 있는 방법을 알아보겠습니다. 먼저 중복되는 컬럼들을 가지고 있는 BaseEntity를 생성합니다. @Getter @MappedSuperclass @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @CreatedDate private Local..
Django를 활용해서 웹서버를 구성할 때 기간만료 처리, 주기적인 이메일 발송 등 특정 작업을 주기적으로 실행하는 상황이 생깁니다. 이때 Django 웹서버에서 리눅스의 Crontab을 기반으로한 django-crontab 라이브러리를 사용하면 주기적인 작업 실행을 쉽게 처리할 수 있습니다. 간단히 django-crontab 작업을 생성해보고 이를 Docker 컨테이너에서 실행시키는 방법을 알아보겠습니다. django-crontab 설정 pip install django-crontab pip 으로 간단하게 django-crontab을 설치한 후 setting.py를 수정해줍니다. INSTALLED_APPS = [ ... 'django_crontab' ] CRONJOBS = [ ('* * * * *', ..

Spring Security의 PasswordEncoder를 공부하며 든 궁금증을 정리합니다. 암호화 해시함수는 단방향 알고리즘이기 때문에 해시값으로 저장된 비밀번호를 역으로 계산해서 원래의 암호를 알아내는 것은 불가능하며, 로그인을 할때는 입력받은 값을 같은 해시함수에 넣어 결과값을 얻고 이 값과 같은 값이 데이터베이스에 있는지 확인함으로써 로그인을 처리합니다. 하지만 이런 방식 또한 취약점이 있는데 바로 입력 가능한 모든 문자열 조합을 해시함수에 넣어서 결과를 저장한 테이블인 Rainbow Table을 사용하여, 탈취한 암호값을 일일이 대조하여 비밀번호를 알아내는 방식의 브루트 포스 공격이 가능하다는 점 입니다. 그래서 현대의 암호화 해시함수에서는 입력값에 랜덤으로 생성한 값(이를 salt라고 합니다..

Spring Data JPA에서 기본적으로 제공해주는 쿼리 메서드 기능으로는 복잡한 로직의 쿼리를 구현하는 데에 한계가 있고, @Query 어노테이션을 이용하여 JPQL문을 직접 문자열로 입력하는 방식도 type-safety를 지원하지 않고 컴파일 타임에 구문오류를 발견할 수 없는 것과 같은 문제점이 있습니다. Querydsl은 이러한 점을 해결해주는 JPQL 작성 라이브러리이며, Spring Data JPA와 조합하여 복잡한 쿼리를 자바 코드를 통해 type-safe하게 작성 가능하고 Spring Data JPA의 Repository 인터페이스와 매끄럽게 연동되는 장점이 있습니다. 다만, 초기 세팅 과정이 번거로운 편인데 이번 포스팅에서 springboot와 mysql에 querydsl을 사용하기 위한..

Java 진영의 DB기술들을 공부하다 보면 필연적으로 MyBatis, Hibernate, Spring Data JPA을 접하게 되는데 다들 비슷해 보이고 개념에 혼동이 오곤 했습니다. 각 모듈들에 대한 정확한 개념을 정리하고자 포스팅을 작성합니다. MyBatis MyBatis는 SQL Mapper의 일종입니다. SQL Mapper란 RDBMS 쿼리문의 실행 결과를 실제 자바 코드에 매핑하기 위한 프레임워크로 이를 활용하면 프로그램 코드와 SQL을 분리할 수 있다는 장점을 가집니다. MyBatis는 별도의 XML파일에 SQL문을 작성하고 이를 자바 프로그램의 메서드에 매핑해줍니다. 위와 같은 표기법으로 작성된 XML파일은 아래 자바 프로그램의 메서드에 매핑되고 이 메서드를 활용해서 데이터베이스에 접근하게 ..

자바를 공부하다 보면 문자열 리터럴은 불변이라는 점이 많이 강조됩니다. String str1 = "Kim"; str1 = str1 + "Lee"; 즉 위와 같은 경우에 str1에 할당된 "Kim"이라는 문자열 리터럴이 "KimLee"로 변하는 것이 아니라, str1은 새로 생성된 "KimLee"라는 문자열을 가리키도록 변하는 것입니다. String str1 = "Kim"; String str2 = "Kim"; System.out.println(str1 == str2); // True! ※ 만약 같은 내용의 문자열을 가리키는 두 변수가 서로 다른 주솟값을 가지게 하고 싶다면 str2 = new String("Kim") 과 같이 new 연산자를 사용해서 할당해주면 됩니다. 또한 같은 문자열 리터럴 값을 가지..