본문 바로가기
관리자

Programming-[Backend]

(393)
[TIL][작성Java - @RequestBody null 문제: jackson, @NotNull, @NoArgsConstructor 문제 상황 controller와 @RequestBody를 아래처럼 정의하고, http POST request을 json 형태로 전송했다. 그런데 에러가 발생했다. @PostMapping("/stock") public void stockItem(@RequestBody @Valid ItemPo itemPo) { ... } // @Data public class ItemPo { @NotNull private ItemType itemType; } 에러코드 일부 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of ... (no Creators, like default construc..
[TIL] JPA @ManyToMany 적용, 테이블 이름과 컬럼, 저장 처리 방식 1. 배경 예전에 JPA를 학습할 때, @ManyToMany는 사용하면 안된다고 배웠었다. 이것은 혹시나 나중에 두 엔티티간 매핑 테이블에 컬럼이 추가될 수도 있는데 @ManyToMany를 적용하면 컬럼 추가가 어렵기 때문이라고 배웠다. https://whitepro.tistory.com/413 그래서 한 번도 써보지 않았는데, 정말 순수하게 mapping만 필요한 경우이고 간단하게만 적용하면 되는 경우라 적용하게 되었다. 위 예시에서처럼 추가 정보가 필요한 경우 두 엔티티 중 하나의 테이블에 컬럼을 추가하면 된다고 생각이 들었다. 그리고 서비스가 크지 않고 향후에도 큰 영향도가 없다고 판단되어 일단 적용해보았다. 절대 권장할만한 방식은 아닌 것 같다. 그래도 일단 기록은 남긴다. 2. 실제 적용 예시 ..
[TIL] 클래스 내 private 메서드 임시 테스트 @PostConstruct, Column 이름 예약어 escape 처리 1. 클래스 내 private 메서드 임시 테스트 테스트 코드를 남길 필요가 없거나, 테스트를 하기가 곤란한 경우 임시로 빠르게 테스트를 할 수 있는 방법으로 @PostConstruct를 이용할 수 있다. DB에 잘못된 데이터가 삽입될 수 있으므로 사용에 주의해야한다!! 위 그림처럼 Class내에 save... 메서드가 있고 이것을 임시 테스트하고 싶다면 @PostConstruct의 init() 메서드에 해당 메서드를 불러와서 실행하면 된다. 메서드에 들어가는 인자값들을 세팅해주고 세팅 과정에서 필요하다면 XxxRepository 같은 다른 클래스를 @Autowired로 주입받으면 된다. 이후 디버깅 모드로 breakpoints를 잡고 테스트해보면 파악이 힘든 에러나 동작 테스트를 임시로 해볼 수 있다...
[TIL] 😎 MYSQL 필드 최대 길이 정의 varchar 255 vs 191 varchar 255 이유 MYSQL에서 필드의 최대 길이를 정의할 때 varchar(255)로 지정하는게 일반적이였다. 이것은 참조 링크에 따르면 MYSQL에서 메모리 용량을 8비트(256)에 맞추고 오래된 database와 호환하기 위해서 등이였다고 한다. 그리고 MYSQL에서 varchar로 된 필드를 indexing하기 위한 최대 용량을 767 byte로 잡아놨었다. 이것은 utf-8 기준이였고 767/3 = 255.666...이 되기 때문에 varchar 255로 정의하는게 관례였다. 3으로 나누는 이유는 utf-8 기준으로 모든 글자들이 3바이트에 포함되었기 때문이었다. varchar 191 이유 그러다가 이모지 🚀까지 포함하는 utf8mb4 collation 규칙이 적용되면서 한 글자에 4바..
[링크] could not initialize proxy - no Session Service 레이어에서 Entity를 가져올 때 발생할 수 있다. Entity에 접근해서 JPA의 Fetch 설정이 LazyLoading(주로 1:N으로 연결된 필드) 설정인 경우 서비스 레이어 -> 컨트롤러 레이어에서 프록시 객체를 넘겨서 발생할 수 있다. 아래 참조 글에 따르면 이것은 프록시 객체를 가져오는 것도 트랜잭션 단위로 이루어지기 때문이다. 서비스 레이어에서는 StudentDto내에 School 엔티티를 프록시로 들고 있어도 되지만, 그대로 서비스 레이어를 끝내고 다른 레이어로 넘어가면 세션이 끝나버려서 프록시로 들고 있던 School 엔티티의 값을 참조하지 못하게 된다. 서비스 레이어에서 모든 프록시 객체들을 개별 DTO로 변환하는 것이 추천된다. Eager 로딩할 수도 있겠으나 N+1 ..
[TIL] Django Restframework Exception Handler 개요 1. Exception Handler 설정 Django에서 exception handler는 settings.py 파일의 RESTFRAMEWORK 설정에서 경로를 지정해줄 수 있다. 기본적으로는 Class를 지정하여 사용하며 exception_handler.ExceptionHandler를 상속받아 메서드들을 override한다. from rest_framework.views import exception_handler class CustomExceptionHandler(exception_handler.ExceptionHandler): def handle_exception(self, exc): # Custom logic to handle the exception # Return a custom respon..
[TIL] Django Cache 개요 1. Cache 설정 Caching은 잦은 접근이 예상되어 데이터베이스에 직접 접근하지 않고 Memchached나 Redis 같은 속도가 빠른 저장소에 데이터를 저장해놓는 방식이다. Django에서는 아래와 같이 settings.py에 설정하여 사용할 수 있다. CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'dj..
[TIL] 여러 where 조건 한번에 조회하기. multi column related id query join 상황 base_table에 a, b컬럼이 FK로 잡혀있고, 중복된 항을 count로 구한 결과가 아래와 같을 때 다시 base_table에서 a_id, b_id를 갖는 id 값을 조회할려면 어떻게 해야할까? 다시 말해 (a_id, b_id) = (9002, 3145), ...인 Row들의 각 id 값을 구하고 싶은 경우 어떻게 해야할까 해결 방법 with 구문(또는 서브쿼리)로 원래 SQL문을 감싸고, 기존 테이블과 join을 하되 on절에 원하는 조건을 기입하면 된다. with tmp as (select count(id), a_id, b_id from base_table bt where 1 = 1 and deleted is null group by a_id, b_id having count(id) > ..