본문 바로가기

전체 글

(145)
Mybatis 동적 쿼리, #{}과 ${}의 차이 mybatis를 사용하면서 검색을 구현하려다가 like쿼리에서 에러(Parameter index out of range)가 발생했다. 일반적으로 mybatis에서 인자로 받은 변수는 #{변수명}과 같이 사용한다. 이때 저 변수명은 "문자열"로 출력된다. 만약 문자열이 아니라 안의 글자 값 자체를 그대로 사용하고 싶다면 #대신 $를 사용하면 된다. LIKE "%#{param}%" // 오류 발생 LIKE "%${param}%" LIKE CONCAT('%',#{search},'%') ?(preparedStatement) 부분에 인자로 들어온 문자열이 들어간다. 문자열 안에 문자열을 넣어버려서 에러가 발생했다. 검색 그 자체가 바로 들어가는 것을 볼 수 있다. $를 사용할 경우 SQL Injection 공격을..
bindingResult 가 무엇일까? (feat. Valid) 스프링 부트를 이용해 api를 구현하다보면, 입력값을 받아야 하는 경우가 존재한다. 사용자에게서 데이터를 받아 저장할 일이 반드시 생기기 때문이다. 이 때 사용자가 어떤 데이터를 마음대로 커스텀해서 보낼지 모르기 때문에 반드시 데이터 검증을 해야한다. 스프링부트에서는 검증을 빠르게 해주는 validation이 있다. 단, 2.3이상부터는 따로 분리되었기 때문에 반드시 의존성을 따로 추가해 주어야 한다. implementation 'org.springframework.boot:spring-boot-starter-validation' gradle 내가 정의한 Dto에 @Null과 같은 validation annotation을 붙이고 컨트롤러 인자에 @Valid(자바에서 지원) 혹은 @Validated(스프링..
logger를 사용할 때 static을 붙이고 안붙이고 차이가 무엇일까? 스프링부트를 사용하면서 로그를 찍기위해 서비스에 아래와 같은 로그를 초기화하여 사용하고 있었다. 그런데 사수님께서 static 안붙인 이유가 있는지, static 붙이고 안붙이고의 차이가 무엇인지 물어보셨다. static은 메모리에서 저장되는 위치가 힙 영역이 아니라 데이터 영역(전역변수, static 변수)에 저장되어 여러 클래스 객체를 생성하더라도 하나만 공유한다고 알고 있었다. 그런데 스프링은 빈에 인스턴스를 등록해 싱글톤으로 관리되는데 굳이 static으로 할 필요가 있나? 라는 생각을 갖고 열심히 인터넷을 뒤적거려봤다. 참고에 뒤적거린 사이트들을 적어두었다. static을 사용하면 생기는 장점 1. 잘 알려진 관용구이다. (이게 왜 장점이지?) 2. CPU, Memory 오버헤드가 적다. log..
thymeleaf 정리 (작성중..) SSR을 위한 JAVA 템플릿 엔진인 thymeleaf에 대한 정리를 이 포스트 하나로 끝내려고 한다. 사용방법 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' gradle 기준으로 위와같이 작성하면 된다. spring.thymeleaf.cache=false application.properties에 위와같이 작성한다. 캐싱을 하지 않는다는 뜻이고, FE쪽 코드 수정시 바로 반영될수 있게 하기 위해 개발 환경에서는 꺼두는 것이 좋다.
COUNT 함수 고찰 SQL 쿼리는 MySQL을 기준으로 합니다. 게시글 목록 화면을 구현할 때 10개의 게시글에대한 각각의 댓글의 개수를 가져오고 싶었다. LEFT OUTER JOIN을 하고 COUNT만을 사용하게 되면, 다른 LEFT OUTER JOIN이 있을경우 올바른 댓글의 개수를 가져오지 못할 수 있다. 중복되는 comment.id가 존재할 수 있기 때문이다. SELECT COUNT(comment.id) AS commentCount FROM board LEFT OUTER JOIN comment ON board.id = comment.boardId 이렇게 오로지 comment만 LEFT OUTER JOIN을 사용한다면 문제없이 댓글의 개수를 가져올 수 있다. 그런데 만약에 다른 LEFT OUTER JOIN이 추가되어 ..
네이버 부스트캠프 8기 챌린지&멤버십 회고 2023년 6월 즈음 몇몇 곳의 면접을 모두 떨어지고 무엇을 해야 하나 고민을 정말 많이 하던 시기였다. 그러던 중 네이버 부스트캠프 모집 공고를 보게 되었다. 사실 처음에는 할 생각이 없었다. 나는 자바 웹 백엔드 분야로 취업을 준비하고 있었는데 이곳은 처음에는 풀스택으로 배우고, 백엔드 분야로 나누더라도 자바가 아닌 자바스크립트를 사용한다고 나와있었기 때문이다. 고민하다가, 그래 지금 내 사정에 거를게 뭐가 있냐 라는 생각에 일단 써보기로 결심했다. 다른 부트캠프와 다르게 지원금도 나오지 않고, 지원할 때 만원을 내야 한다는 사실이 한번 더 고민하게 했지만, 그래도 결국 마지막날에 여러 양식들을 모두 작성해 지원하게 되었다. 얼마뒤 1차 코딩테스트가 있었다. 알고리즘 2문제와 CS 지식 문제가 나왔던..
채용 사이트 모음 in this work it 관련 채용 공고 https://inthiswork.com/?s=IT%EA%B0%9C%EB%B0%9C 점핏 https://www.jumpit.co.kr/ 자소설 닷컴 https://jasoseol.com/ 채용은 아님, 스타트업 모음 혁신의 숲 https://www.innoforest.co.kr/ 회사별 복지 설명 복지리 https://bokziri.notion.site/bokziri/Bokziri-com-3e16ab5efbba47ad95d923c2de142255 모든 분야 채용 공고 있음 잡코리아 https://www.jobkorea.co.kr/ 국민대 https://cs.kookmin.ac.kr/news/jobs/
[algo-with-me] 기능 개발 시작 (6) 작성중.. 총 6주 프로젝트에서 2주차 부터 본격적인 개발을 시작했습니다! 1주차에는 개발 시작 전 여러 규칙들을 정하고 저희 프로젝트의 뱡항성을 잡는데 많은 시간을 쏟았습니다. 총 6주라는 프로젝트 기간 중에 약 4주정도를 개발하는 시간으로 쓸 예정이었고 이에 맞춰 모든 개발해야할 기능들을 정리했습니다. 개발할 모든 기능을 작성 한 뒤 주차별로 우선순위를 두어 개발할 기능들을 정했습니다. 그리고 드디어 2주차부터 분배한 기능들의 개발을 시작했습니다. 이번 포스트에서는 2주차 기능 개발 내용을 담았습니다. 프론트 - 무지, 콘, 네오 백 - 저(제이지), 프로도 문제 api 구현 가장 처음 구현할 api는 바로 문제 CRD api입니다. 저희는 알고리즘 대회서비스이기 때문에 알고리즘 문제가 있어야 합니다. 저희 초..