개발 기록
-
MariaDB. ST_Distance_Sphere does not exist. Let's create!개발 기록 2024. 4. 4. 14:50
ST_Distance_Sphere는 MariaDB의 버전을 탄다. 로컬(10.4.32-MariaDB)에서는 ST_Distance_Sphere가 작동해서 테스트를 문제없었지만 서버(10.4.8-MariaDB)에서는 ST_Distance_Sphere does not exist 에러가 발생했다. 아래에 ST_Distance_Sphere 함수 지원에 대한 정보가 있지만 믿을만한지 모르겠다... https://mariadb.com/kb/en/st_distance_sphere/ ST_DISTANCE_SPHERE Spherical distance between two geometries (point or multipoint) on a sphere. mariadb.com 없으면 만들어서 사용한다. 함수를 만드는 방법을..
-
Nextjs 14. how to add unsupported metadata개발 기록 2024. 1. 12. 00:27
nextjs 14.0.4로 개발 하던중 을 추가해야할 일이 생겼다. nextjs 14에서 메타 태그를 추가하는 방법은 layout.js나 page.js에 아래와 같은 방법으로 매타 데이터를 추가해주면 된다. // layout.js | page.js import { Metadata } from 'next' export const metadata = { title: '...', description: '...', } export default function Page() {} 하지만! 현재 지원하지 않는 태그들도 있다. https://nextjs.org/docs/app/api-reference/functions/generate-metadata#unsupported-metadata Functions: gene..
-
Spring boot. JPA Expecting a SELECT query개발 기록 2023. 9. 20. 14:45
JPA를 사용해 delete 쿼리를 날리던중 "Expecting a SELECT query" 라는 오류 메세지가 등장했다. @Query("delete from AbcKeyword ak " + "where ak.profile.id = :id ") void deleteAllByProfileId(UUID id); JPA는 delete를 수행하기 전에 select를 날리기 때문이다. 디버깅 모드로 끊어서 보면 repostory의 delete를 실행하는 시점에서는 실제로 select가 실행되고 select 결과에 따라서 트랜젝션이 끝날때 delete를 실행한다. @Transactional // 2. delete 실행 public void deleteAbc(...){ abcRepository.delete~~(id)..
-
Spring Boot. How to get custom header value using @RequestHeader개발 기록 2023. 8. 31. 18:58
환경. spring boot 3.1.1 목표. 웹 필터에서 커스텀 헤더를 추가하고 컨트롤러에서 @RequestHeader를 이용해서 값을 가져온다. 시작. 웹 필터에서 커스텀 헤더를 추가하기 위해선 보통 MutableHttpServletRequest를 만들어서 사용할 것이다. 하지만 인터넷에 돌아다니는 보통 많이 쓰는 코드를 가져오면 컨트롤러에서 @RequestHeader를 이용해서 값을 가져오지 못할 것이다. 이유는 getHeaders()를 오버라이딩 하지 않은 코드이기 때문이다. 컨트롤러에서 @RequestHeader를 사용하고 디버깅을 걸어서 코드를 따라가보면 스프링이 getHeaders()에서 값을 가져오는 것을 알 수 있다. (그 중에서도 coyoteRequest라는 변수에서 값을 꺼내온다.) ..
-
Spring Boot. GoogleIdTokenVerifier's parameters(HttpTransport, JsonFactory) : How to know that?개발 기록 2023. 8. 10. 12:34
환경. java 17 spring boot 3.1.1 google-api-client:2.2.0 목표. 1. GoogleIdTokenVerifier 생성에 필요한 파라메터를 찾는다. (HttpTransport, JsonFactory) 2. 사람들은 이것을 어떻게 알아냈는지 알아본다. 문제. https://developers.google.com/identity/gsi/web/guides/verify-google-id-token?hl=ko 서버 측에서 Google ID 토큰 확인 | Authentication | Google for Developers 이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 의견 보내기 서버 측에서 Google ID 토큰 확..
-
Spring Boot. @PathVariable with a dot(.) gets truncated개발 기록 2023. 7. 3. 16:21
이 내용은 스프링 문서에 있는 내용의 요약이다. https://www.baeldung.com/spring-mvc-pathvariable-dot @PathVariable은 컨트롤러에서 사용되는 어노테이션이다. // ex. controller @GetMapping("{email}") public ResponseEntity getByEmail(@PathVariable String email) { System.out.println(email); return ResponseEntity.ok(email); } 문제는 이메일과 같은 dot(.)을 포함하는 문자열이 들어가면 원하는대로 작동하지 않는다. (.) 이후의 문자열은 사라진다. abc@abc.com => abc@abc 어떻게 해야할까? 스프링 문서에 답이 있다..
-
MySQL. 'Select tables optimized away' vs 'Using index'개발 기록 2023. 6. 30. 18:34
쿼리를 짜다 보면 마지막 seq를 가져와야 되는 경우가 생긴다. 이 경우 보통 2가지 경우를 사용한다. -- seq는 pk다. SELECT MAX(seq) FROM abc; SELECT seq FROM abc ORDER BY seq DESC LIMIT 1; seq가 pk 이기 때문에 둘다 빠르다. 하지만 개발자라면 무엇이 더 빠를지 고민이 생길 것이다. 그래서 explain을 사용해본다. EXPLAIN SELECT MAX(seq) FROM abc; -- => Extra: Select tables optimized away EXPLAIN SELECT seq FROM abc ORDER BY seq DESC LIMIT 1; -- => Extra: Using index 그러면 Extra의 설명에 위와 같은 메세..
-
MyBatis. BindingException: parameter '~~' not found개발 기록 2023. 5. 31. 14:12
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [arg1, arg0, param1, param2] MyBatis를 사용하면 Mapper 부분에서 종종 만나는 오류이다. 코드를 수정한 것이 없는데 개발을 하다 보면 갑자기 나오기도 한다. 하나하나 파악해보겠다. 환경: java 1.8 spring boot 원인: (아래의 코드들은 자바 버전에 따라서 개선된 부분이 있지만 큰 틀은 비슷하다.) 오류가 난 부분부터 코드를 따라가다 보면 MapperMethod 클래스의 이너..
-
MongoDB. upsert multi개발 기록 2023. 5. 18. 01:58
몽고DB에서 upsert를 한번에 여러개 하는 방법이다. 환경 spring boot 3.0.6 spring-boot-starter-data-mongodb 3.0.6 방법 MongoTemplate는 updateMulti는 제공하지만 upsert는 이와 관련된 기능이 없다. 하지만 BulkOperations을 이용하면 구현 가능하다. public void example() { // mongoTemplate.bulkOps(BulkMode, "콜렉션이름") BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "movies"); // 1번 Query query1 = new Query() .addCriteri..
-
MySQL. random string(alphabet + number)개발 기록 2023. 5. 10. 18:13
MySQL / Mariadb 에서 내장함수를 사용하여 무작위로 문자열을 생성하는 방법에 대한 기록이다. 랜덤한 문자열을 주는 내장 함수 16진수로 표현된 문자열을 준다. (랜덤 문자열을 생성하기 위해서 RAND()함수를 추가한다.) *16진수로 표현된 문자열을 준다는 말은 모든 알파벳을 주지 않는다는 말이다. (0123456789abcdef) SHA1(RAND()) => 40자리 MD5(RAND()) => 32자리 HEX(RAND()*0xFFFFFFFF) => F의 갯수만큼 UUID() => 4개 하이픈(-) 포함 36자리 기타 다른 것들도 있다. 모든 알파벳과 숫자를 포함하는 랜덤 문자열을 생성하려면 어떻게 해야할까? 여러가지 방법이 있겠지만 그 중에 내장함수중에 TO_BASE64() 라는 것이 있다...