Spring Data JPA 이렇게 편리하다니...
JAVA/Spring 2023. 8. 31. 01:14

국비교육도 그렇고 처음 입사했던 회사도 그렇고 전부 SQL을 직접 짜는 MyBatis를 이용했었다. JDBC를 사용하면서도 자바 백엔드 코드와 SQL이 함께 있는 로직도 경험하였을 때 백엔드 코드와 SQL이 분리된 MyBatis는 정말 편리한 프레임워크였다. 복잡한 SQL을 처리할 수 있고, 방금 insert한 데이터의 Key값을 받아오기도 잘 되어있고, 짜기 나름이겠지만 분리되어 있으니 유지보수도 나쁘지 않았다. JPA라는 기술을 첫 회사다닐 때 옆자리 개발자분 덕분에 어떤 기술인지 제대로 알게 되었는데 알게 된지 어언 2년 정도 지나서 한번 사용해보고 싶다는 생각이 들게 되었다. 무엇보다 마음에 들었던 것은 어떤 SQL 문법을 쓸지 신경쓰지 않아도 되는 것이었다. 나는 크로스 플랫폼, 하이브리드 같은..

코드가 실행되는 순서를 볼 수 있는 디버깅 사이트
JAVA 2023. 7. 15. 03:08

코딩을 공부하는 친구를 도와주다가 이 친구가 풀고 있는 자바 문제를 이클립스로 옮겨서 디버깅모드로 코드가 실행되는 순서를 보여주려고 한 적이 있었다. 그런데 이클립스에서 디버깅을 하면 Step into로는 내부 클래스까지 들어가버려서 볼 필요없는 코드까지 디버깅이 들어간다..; 그렇다고 Step over로는 main단의 함수만 실행이 되어 좀 불편했다. 브레이킹 포인트를 좀 더 체크했었어야 했을까.. 암튼 상속 등의 객체 지향적 흐름을 보기엔 영 불편했다.. 분명 웹 환경에서 흐름을 볼 수 있도록 만들어놓은 사이트가 있을 것이라 생각하고 찾아본 결과 좋은 사이트를 발견했다. https://pythontutor.com/ Python Tutor: Learn Python, JavaScript, C, C++, ..

Spring Security authorizeRequests() 폐기에 따른 대안..
JAVA/Spring 2023. 5. 19. 03:33

어느 날 만들어놓은 로그인 기능을 살펴보니 줄이 그어져 있었다. authorizeRequests()의 deprecated.. 이걸 어떻게 대체하지? 라고 생각해서 찾아봤는데 생각보다..간단했다. 가운데에 Http만 넣어서 authorizeHttpRequests()라고 바꿔주면 된다. 그리고 antMatchers도 에러가 뜨는데 이클립스에서는 마우스만 올리면 알아서 대체 대안을 내어주었다. ant만 request로 바꿔주면 된다. 즉 정리하자면 authorizeRequests() -> authorizeHttpRequests() antMatchers() -> requestMatchers()

WebClient를 이용한 API 호출과 그 리턴 값 다루기(JSON)
JAVA/Spring 2022. 8. 3. 15:18

API를 이용한 서비스를 만들어야 할 때가 있다. 보통 API를 제공하는 측에서 API를 어떻게 사용할 수 있는지 문서를 제공하거나 그 가이드를 제공한다. www.API주소.com?파라미터1=값1&파라미터2=값2 www.APIAdress.com?parameter=value&key=value 이런 식이다 처음에는 이런 주소형식의 API를 사용하려면 자바스크립트 location.href 를 이용해서 주소를 넣고 값을 다루는 줄 알았다. 혹은 AJAX를 이용해서 주소를 보내고 리턴값을 받는? href 같은 주소 이동기술?은 오직 프론트에서만 다루는 줄 알았다. 국비교육을 들었을때도 프론트에서 처리하는 방법 밖에 안 배웠었던 이유도 있다. 그런데 이런 API를 다루는 로직을 생각하다보니 API의 value를 동..

Map에서 정수를 꺼낼 때 java.math.BigInteger cannot be cast to java.lang.Integer 오류
JAVA/Spring 2022. 7. 18. 00:34

프론트에서 백으로 데이터를 보낼 때 생산성을 이유로든, 너무 일회성이라 DTO를 만들기 애매할 때든, 어떤 이유가 되었던 간에 JAVA bean DTO를 만들지 않고 Map 맵 형식으로 키, 밸류를 받아 사용할 때가 있다. 그런데 Map형식으로 받은 데이터를 키값을 이용해 사용하려고 할 때 정수형 int를 선언해서 쓰려고 하면 에러가 발생한다. java.math.BigInteger cannot be cast to java.lang.Integer Map에서 정수를 꺼낼 때 BigInteger로 꺼내기 때문인데 추측하기로는 map에 들어오는 데이터가 long보다 큰 수일 수도 있으니 제한이 없는 BigInteger로 꺼내는 게 아닐까...추측해본다. 이 에러는 스프링에서는 두가지로 해결 할 수 있는데... ..

[MyBatis] 방금 insert한 테이블의 Auto Increasement 값 가져오기
JAVA/Spring 2022. 6. 29. 02:07

웹 기능을 구현하다 보면 서로 연관된 로직을 작성할 때 FK로 이어주기 위한 값이 자동으로 값이 할당되는 Auto Increasement(이하 AI) 값인 경우가 있다. 예를 들면 쇼핑몰에서 하나의 주문서 안의 여러개의 주문상품들. (주문서 번호가 13이라면 13의 주문서 번호를 가지고 있는 여러개의 주문상품들) 통장 개설할때 처음에 얼마를 넣으면서 통장을 만드는 등의? 하나의 백엔드 서비스 메서드 안에서 진행되는 것들이다. 그런데 이 AI값은 insert 되기 전에는 데이터 테이블 상에 없는 값이므로 가져오는 쿼리도 짜기가 막막하여 처음 로직을 수립할 때에 곤란을 겪을 수 있다. 이 AI 값을 가져오기 위해서는 여러가지 방법이 있겠지만 세가지 방법을 소개해보겠다. 세가지 중 두가지는 원시적인 방법이고 ..

스프링 비밀번호 암호화/복호화?
JAVA/Spring 2022. 6. 6. 01:17

1. 암호에 대한 기본 설명 스프링에서는 passwordEncoder로 DB에 비밀번호를 저장할때 관리자도 비밀번호를 알 수 없도록 비밀번호 암호화를 지원한다. 해시함수를 이용해서 암호화를 하게 되는데 암호화 된 비밀번호는 사람이 알아보기 어려운 형태를 띤다. 예를 들어 비밀번호가 1234 라면 암호화되었을때는 → '$2$17a$L3kE8oeG...' 암호학의 어떠한 수학 공식을 이용해서 사람이 알아보기 힘들게 저장 된다. 암호학에 관련된 영역까지는 모르니 넘어가고 이렇게 암호화 된 비밀번호와 내가 로그인 할때 입력한 비밀번호는 당연히 다를 수 밖에 없는데 어떻게 로그인이 되는 것일까? 아! 나는 바로 생각해낼 수 있었다. 옛날에 군대에서 파일을 암호화해서 송/수신하고 송수신 된 파일을 보기 위해서 복호..

이클립스를 쓸 때는 램 16GB 이상은 필수!!
JAVA/버그(bug) 2022. 5. 22. 23:09

나는 개발할때 툴을 다 다르게 쓰는 편이다. back 단은 이클립스 front 단은 VS CODE DB 생성 및 쿼리는 MySQL WorkBench Git 은 Git bash.. 등등 이클립스에서 FRONT를 하기엔 영 불편하고 프론트 인력과 협업할 때에 대부분의 프론트 인력들이 VS CODE를 사용하기 때문에 이런 스타일을 취하게 되었다. 회사에서 지급한 노트북 램이 8GB 라서 알게 된 사실인데 이 툴들을 한꺼번에 다 켜놓고 쓰면 이클립스 자동완성이 안된다... 자동완성에 의존하는 편이 아니지만 가끔 몰랐던 형태의 자료형이나 클래스를 맞이하게 되면 이것이 어떤 메서드를 가지고 있는지 자동완성 추천에 뜨는 메서드들을 보고 알아가기도 하는데 자동완성 박스가 무한 로딩이 걸린다. 시간단축에도 용이한데 작동..

DTO는 무수히 만들어질 수 있다.
JAVA/Spring 2022. 4. 22. 01:43

처음에 스프링을 배울 때 Controller, DAO, DTO, Service 로만 배웠다. 이 중에 DTO에 관련된 부분에서 Entity나 VO라는 개념 없이 DTO로만 배워서 DTO로 다 하는 줄 알았는데 역시나 스프링의 세계는 심오하고도 깊었다. 논리적인 분리이지만 쉽게 얘기하면 DB에 Insert, update 할 때 쓰이는 Entity 사용자단에서 보이는 데이터를 뿌리는 용도의 DTO VO 불변이라지만 사실상 개념의 차이인듯 하다 Mybatis를 이용해서 두 테이블을 JOIN해서 resultType으로 두가지 DTO를 받고 싶을 때 resultMap을 이용하는 방법도 있지만 그때그때 페이지에 보여줄 DTO를 계속 만들어주는 것이 보안적으로도 좋고 쿼리를 짜기에도 좋고 훨씬 생산적이라고 생각한다.

삼항 연산자로 else if 만들기
JAVA/Spring 2022. 4. 3. 00:17

음악 데이터테이블이 있고 컬럼 중에 장르가 있다고 가정한다. 각 장르는 숫자로 구분한다. 0 = 롹 1 = 힙합 2 = 발라드 3 = 트로트 음악(music) 노래 가수 장르 좋은 날 아이유 1 (힙합) Rocking tonight 메탈리카 2 (발라드) 불타오르네 방탄소년단 3 (트로트) 뚜두뚜두 블랙핑크 0 (롹) 우주를 줄게 볼빨간 사춘기 1 그건 아마 우리의 잘못은 아닐거야 백예린 2 좋니 윤종신 2 킬리만자로의 표범 조용필 3 서버에서 music이라는 이름으로 뷰단에 데이터가 넘어온다고 가정해보자 서버에서 뷰로 데이터를 뿌릴 때 서버사이드 렌더링이라면 표현언어를 사용하여 if문 속에 태그 내용을 써서 조건을 줄 수 있지만 타임리프 롹 힙합 발라드 트로트 JSTL 롹 힙합 발라드 트로트 태그별로 ..

ClassCastException 에러
JAVA/Spring 2022. 3. 22. 16:32

class~~~cannot be cast to class ~~ Entity와 DTO 혹은 VO를 구분지어서 사용할 때 만날 수 있는 에러이다. 컨트롤러에서 Entity로 받고 Mybatis에서는 DTO로 resultType을 받는 경우이다 나의 경우 둘을 맞춰주었더니 해결되었다.. 무슨 Devtools를 지우고 진행해라 이런 글도 있었는데 개발환경 상 불가능했기에 나의 실수가 있는지 찾아보다가 발견하였다.

비트 연산을 쓰는 이유
JAVA 2022. 2. 22. 22:11

비트 연산자(bitwise operator) 비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자이다. 또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다. & 대응되는 비트가 모두 1이면 1을 반환. (비트 AND 연산) | 대응되는 비트 중에서 하나라도 1이면 1을 반환. (비트 OR 연산) ^ 대응되는 비트가 서로 다르면 1을 반환. (비트 XOR 연산) ~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산) 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산) 다음 그림은 비트 AND 연산자(&)의 동작이다. 이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우..

[Spring]DAOImpl 없애기
JAVA/Spring 2022. 2. 6. 18:16

예전에 했던 프로젝트를 리팩토링해보면서 스프링의 DAO와 DAOImpl, Service의 상관관계를 생각해보게 되었다. sqlsession 때문에 DAOImpl을 만들지만 왠지 모르게 이 로직을 머리로 생각을 했을 때 괜히 복잡해지는 느낌이 있었다. 그런데 무려 인터페이스에 @Mapper만 달아주면 Impl이 필요 없는 것을 발견하게 되었다!! 원래라면 sqlsession을 이용해서 sql에 접근하지만 Mybatis 3.0부터 어노테이션만으로 매핑 사용이 가능하다고 한다!!

[JAVA] 숫자 소수점 반올림/올림/내림
JAVA 2022. 1. 30. 19:46

자바로 개발하다보면 소수점 계산할 때에 몇 자리까지 표시할지, 반올림을 할지 결정을 해야할 때가 있다. 반올림 같은 경우는 다양한 방법이 있지만 Math클래스에 대해서 다루어보자. 자바에서는 Math 클래스를 이용한 소수점 반올림/올림/내림 방식이 있다. Math.round(숫자) -> 반올림 Math.ceil(숫자) -> 올림 Math.floor(숫자) -> 내림 그런데 그냥 숫자만 넣어버리면 소수점 첫째자리에서 반올림/올림/내림을 처리한다. 소수점 자리를 정해주고 싶을 땐 표현하고 싶은 자릿수만큼 곱해주고 다시 나눠준다. 나눠줄 수 뒤에는 .0을 붙이도록 한다. 둘째 자리면 (숫자 * 10) / 10.0 셋째 자리면 (숫자 * 100) / 100.0 넷째자리면 (숫자 * 1000) / 1000.0 음..

JAVA Eclipse 초기 세팅해주기(다크화면, 문자 인코딩)
JAVA 2022. 1. 29. 03:21

[이클립스 2021.06 기준] 처음 이클립스를 실행시키면 기본적으로 눈이 아픈 흰 화면에 문자 인코딩이 기본값으로 MS949로 되어있다. 일단 하얀 화면이 너무 자극적이므로 어두운 테마로 바꿔주자 General - Appearance 에 가면 테마를 바꿀 수 있다. Dark로 바꿔주자 이제 좀 눈이 편해졌다. 이제 중요한 문자 인코딩을 바꿔주자 MS949도 한글 인코딩이긴 하지만 이 글로벌 시대에 다른 언어도 문제없이 쓰고 싶다면 UTF-8로 변경해주는 것이 좋다. 웹에서 기본으로 되어있는 EUC-KR은 역시 훌륭한 문자 인코딩 방식이지만 외국에서 볼때 글자가 깨질 수 있으므로 이 글로벌 시대에 적합하지 않다. 파일별로도 UTF-8로 바꿔주자. 문자 인코딩 방식에 대해서는 좀 더 공부해볼 필요가 있을 ..

이클립스 자동완성이 안될 때...
JAVA/버그(bug) 2022. 1. 29. 02:50

예전에 이클립스를 처음 설치 했을 때 자동완성이 잘 되었는데 최근에 안되어서 이클립스 버그인 줄 알았다. 정말 화딱지가 날 뻔 했는데..!! 자동완성이 안될 때 해결 방법을 찾았다! Preferences - Java - Editor - Content Assist - Adavanced 에 들어가보니 Java Proposals가 체크가 되어 있지 않았다. 이걸 체크해주니 이제 잘 된다. 다시 잘 쓸 수 있을 것 같다!! 자잘자잘한 오류만 일으키지 말아주길..

JAVA method는 두개의 값을 반환 할 수 있을까?
JAVA 2022. 1. 28. 22:47

자바 문제를 풀다가 메서드를 활용해서 푸는 문제를 마주했다. 두개의 값을 넣으면 큰 수는 2로 나누고 작은 수는 2로 곱하는 것이다. 메서드를 만들고 return을 두개의 값을 하려고 하니 오류가 났다. 자바의 method는 하나의 값만 반환 할 수 있다. 두개의 값을 반환하고 싶다면 배열을 쓰거나 List로 반환하는 등의 방법을 써야한다.

점점 이클립스를 쓰기가 싫어진다...
JAVA/버그(bug) 2022. 1. 28. 22:38

자바 특화 IDE는 IntelliJ와 Eclipse 만한게 없다고 생각했는데 버그도 그렇고 자동완성 같은 부분에서 영 안뜰 때가 많다. 인텔리제이는 써본 적이 없고 처음 배울때부터 이클립스만 하다 보니 인터페이스가 익숙해져서 이클립스로 코딩을 하는 게 편한데... 조금씩 다른 IDE를 써야할 시기가 오는 거 같다. 생산적인 면에서 이클립스는 좀 아쉽다... 최신버전은 좀 바뀌었을까? 이클립스는 최신버전 쓰기도 무서운 게 예전 코드를 참고하려고 할때 최신버전이면 최신버전에 맞게 다시 재배치?를 하는 거 같다. 최신버전이 마음에 안들어서 다시 돌아가려고 하면 이전 버전에서는 열리지가 않았다. ...만능 IDE는 VSCODE 밖에 없는 것일까? 패키지 볼때나 파일의 유무를 보는 게 이클립스가 편한데 VSCOD..

1부터 100까지의 합 자바로 함수 만들기
JAVA 2022. 1. 28. 22:30

자바는 함수(function)라는 말은 없고 메서드(method)라고 하지만 편의상 함수라고 부르겠다. 기본적으로 1부터 100까지의 합을 구하는 공식은 수학자 가우스가 만든 것으로 유명하다... 그 공식은 바로... n(n+1) / 2 이다. 이것을 프로그래밍으로 표현해보면 (num * (num + 1)) / 2 가 되겠다. 자바로 메서드를 만들어보면? public class Main { public int sum(int num) { return (num * (num + 1)) / 2; } } 위와 같은 함수를 만들 수 있다.

아스키코드(ASCII Code)
JAVA 2022. 1. 26. 17:56

public class Main { public static void main(String[] args) { int a = 'A'; System.out.println(a); } } 자바를 배우다 보면 위의 코드가 조금 이상한 것을 알 수 있다. int는 숫자 정수를 뜻하는 자료형인데 문자인 알파벳 A가 들어가있다. 게다가 Eclipse나 VSCode 같은 IDE로 보아도 에러가 뜨지 않는다. 코드를 실행해보니 65라는 숫자가 찍혀있다. 왜 이런 결과가 나타날까? 그것은 자바가 문자를 표현할 때 아스키코드를 기반으로 표현하기 때문이다 컴퓨터 언어는 숫자이기 때문에 문자를 숫자화 시켜서 컴퓨터에게 보여줘야 한다. (그럼 도대체 숫자라는 개념은 어떻게 인식시켰을까...) 1960년대에 ASCII(America..