Backend22 Hibernate(JPA) 탐구 - 1편(feat. FlushEvent와 Action Queue) 일단 문제를 함께 풀어보자ㅎㅎUser엔티티부터!(사실 서적에서는 엔터티라고 부르던데..난 엔티티가 편하다)QuizGivenJPA를 공부하셨고 구현체인 Hibernate의 ActionQueue에 대해서 들어보셨다면.. 다음 코드의 성공/실패 결과를 예측해보자 문제1테스트코드라 사실 뭐..given , when, then// given...// when & thenval exception = assertThrows { ...}테스트코드라 사실 뭐..given , when, then 그리고 예외를 잡는부분까지 있어야하지만 간단하게 저 테스트가 초록불이 뜰지 주황/빨간불이 뜰지 정도만 예측해보자 답은?답은.. ActionQueue로 혼동을 주긴 했지만, 이건 delete로 인해 준영속화된 엔티티(id가 nu.. 2024. 11. 25. JPA 특징 + 1차 캐시(feat. EntityManager.clear()) 먼저 JPA를 사용할때의 장/단점, 특징, 용어 등을 알아야 한다 JPA란?JPA: 데이터베이스와 객체지향 프로그래밍 간의 매핑을 제공하는 ORM(Object-Relational Mapping) 기술특징데이터베이스를 객체로 매핑하여 SQL을 직접 작성하지 않아도 데이터베이스 작업이 가능영속성 컨텍스트를 통해 엔티티의 상태를 관리트랜잭션 범위 내에서 1차 캐시를 통해 데이터베이스 부하를 줄이고 엔티티의 동일성을 보장. 이 글에서는 JPA의 1차 캐시(First Level Cache)를 중심으로 다룬다 캐시, 캐싱이란?캐시(Cache): 데이터나 값을 미리 복사해 놓는 임시 장소캐싱(Caching): 캐시된 영역에서 데이터를 저장하거나 조회하는 접근 방식 1차 캐시란?1차 캐시(First Level Cach.. 2024. 11. 23. JPA Query 로그 출력(feat. 물고기를 주지말고, 물고기 잡는 법좀 알려줘라..) 블로그에 텍스트 복사/붙여넣기를 막은 이유가 있다내가 정성들여 쓴 IntelliJ 플러그인 25가지 추천 글을 문자 그대로 토씨 하나 안바꾸고 크롤링을 해서 자기 블로그에 그대로 올리는 사람이 있는가하면, 그대로 복붙해서 출처없이 올리는 걸 봤다그때 충격이었다 또한 블로그를 하는 사람들을 무시하는 사람들의 말을 들어보면, 블로그를 한다고 유세떤다, 남의꺼 복붙해서 가져다 쓰는 것이라 말한다나도 어느정도는 동의한다. 양질저질 품질로 따졌을 때 단순히 에러를 해결하는 방법 1줄, 2줄 이정도만 올리는 저질글들이 많다 하지만....시간이 지나감에 따라 21년에 쓴 글이 25년에 될때는 버전 업이 돼서 정답이 아닐지라도 최대한 보는 사람들을 위해서 간단한 프로젝트를 만들어보거나 개인프로젝트에 적용시켜서 테스트를.. 2024. 11. 15. 혹시... 아직도 Java-Faker 쓰세요?(Vulnerabilities을 무시하고 있지는 않으신가요?) Java/Kotlin Spring 진영에서 테스트코드 혹은 실제와 비슷한 더미데이터를 생성할때 쓰는 라이브러리가 있다[ 보통 테스트 코드에서 사용하는 Fixture나 대표/운영진분들이 투자자분들한테 실제와 같은 데이터로 시연화면을 보여주고 싶을때 사용 ] 그것은 아마 자바 대상혁(Java-Faker) 라이브러리일것이다..(너..롤하냐? 왜 기습숭배를..)이 라이브러리의 시초는 루비이며, 거기서 파생되어 나온 프로젝트이다( Maven Repository에서 무려 1833위인 라이브러리 )인터넷에 몇몇 글들 혹은 개발 강의를 보면 이 라이브러리를 가져다 쓰는 곳을 볼 수 있다나름 버전관리도 꽤 한 모습이다(0.18에서 왜 갑자기 1.0으로..?)하지만 가장 최근 버전을 눌러보면9개의 취약성을 갖고 있다는 것.. 2024. 9. 17. 1. 프로젝트 생성(Kotlin Springboot) IntelliJ를 사용하고 있다는 전제 하에 글을 작성한다 1. File -> New -> Project 2. Project 정보들을 적어준다 Name: 알아서 Language: Kotlin Type: Gradle-Kotlin(개인취향) kotlin을 선택하면 .kts파일로 gradle이 관리된다 JDK: Spring 3.x.x이상부터는 최소 17을 사용해야 한다 Java: JDK와 동일하게 한다 Group은 개인 또는 회사의 앞에 붙는 패키지명을 입력해주면 된다 Packaging은 Jar를 추천한다 Kotlin은 Lombok을 쓸 필요가 없다. 이후에 설명할 것이다 Web, Spring Data MongoDB, Spring Data JPA, PostgreSQL Driver, Validation 만 추가.. 2023. 8. 22. 0. Kotlin Springboot3.x.x + Spring Data(Postgresql, MongoDB) + Security 최근에 코틀린 스프링으로 작업을 하면서 포스팅을 해보고 싶었다 기본적으로 2023년 8월 21일 기준으로 최신인 3.1.2 버전으로 만들 것이다 https://spring.io/blog/2023/07/20/spring-boot-3-1-2-available-now Spring Boot 3.1.2 available now spring.io 또한 Spring Data Jpa(Postgre), Spring Data MongoDB(MongoDB)를 커넥션으로 설정해서 요즘 많이 쓰이는 ORDB인 Postgresql과 NoSQL의 절대강자 MongoDB에서 간단 또는 복잡한 쿼리는 어떻게 처리하는지에 대해서 포스팅하려고 한다 중간중간 코틀린 문법을 활용해서 Null처리나 로직을 깔끔하게 가져가 볼 예정이다 마지막으.. 2023. 8. 22. Slack 채널에 메세지 보내기 2023년 (Spring, Js) 1. 슬랙에 가서 자신만의 워크스페이스를 만든다 2. 메세지를 보내고 싶은 채널을 만든다(optional) - 기본 채널로 써도 됨 난 로그인을 하면 로그인한 사용자의 간단한 정보를 슬랙으로 보내고 싶기때문에 채널 이름을 auth로 설정함 사용자 추가는 건너뛰기를 하였다 3. 채널 이름(# 채널이름)에서 아래를 가리키는 화살표 토글 버튼을 누른다 4. 통합 탭으로 눌러서 앱 -> 앱 추가를 누른다 5. 수신 웹훅(Incoming WebHooks)를 추가한다(보기->슬랙에 추가) [ 웹으로 열린다 ] 6. 전송 보낼 채널을 선택한다 7. 웹후크 URL을 복사한다 아래에 메세지전송, 링크추가, 사용자 지정 아이콘, 채널 재정의, curl 요청 등 어떻게 보내는지에 대해 자세히 적혀있다 8. 알림 올 이름을 .. 2023. 1. 8. 협업을 위한 DTO Response Custom 뭐 기본적으로 Entity가 아닌 DTO를 Response로 내려보내야 하는 것은 다들 알 것이다 우리 회사의 Entity Spec을 외부에 노출하지 않으며, Setter가 열린 채로 Entity를 내려보내고, 아직 메모리에 올라와 있는 채로 어딘가에서 누군가가 수정을 하고, 업데이트나 머지가 일어난다면(영속성인 객체상태에서) 끔찍한 일이 아닐 수 없다 static으로 내부클래스로 구현할지 말지는 본인 선택이다. 깔끔해진다는 장점이 있으나 OuterClass.InnerClass이렇게 인자나 반환값이 바뀌게 되어 오히려 이게 안예쁘게 보일 수 있다 프로젝트 브라우저 내에서 이쁘게 보일것이냐 => static(inner) 코드 레벨에서(함수 인자나 반환값으로 쓸 때) 참조를 깊게 안할것이냐 => non st.. 2022. 10. 23. jar Build Task(Feat. thin/plain, fat/uber) + no main manifest attribute in ... 우선 프로젝트를 만들때 Spring initializer로 만들면 IDE가 배포 패키징(아카이빙)을 WAR로 할지, JAR로 할지 선택하라고 한다 그리고 의존성 관리는 Maven(Pom.xml)로 할건지, Gradle(build.gradle-Groovy)로 할건지도 선택하게 된다 일단 이 글에서는 Maven/Gradle, War/Jar의 차이보다는 전반적인 패키징에 대한 것, 그리고 plain-jar, not plain-jar가 무엇인지에 대해서 포스팅해보려고 한다 일단 나 그리고 우리 회사는 로컬에서 빌드 후 파일통신으로 jar를 올려서 돌리기때문에 서버에서 터미널로 빌드를 하지는 않는다 그리고 로컬에서 빌드할때는 빌드 Task의 build를 이용하기보단 bootJar를 이용한다(IntelliJ) 이제.. 2022. 9. 4. DTO 돌려막기 멈춰!(feat. jackson annotation) 짧게 글을 써보겠다 글 제목처럼 가끔 예전에 만들어졌던 DTO를 활용하는 경우가 있다 이럴때 사용할 수 있는 어노테이션이 있다! @JsonIgnoreProperties({"xxx", "yyy"}} private UserRes user; @JsonIgnoreProperties({"xxx", "yyy"}} private UserRes user; user 안에 xxx와 yyy는 json response 필드에 포함하지 않는다는 어노테이션이다 매우 유용하게 활용할 수 있다..! 애초에 null인지 아닌지까지 보여주고싶지 않은 필드에 사용할 수 있다 추가로 리스트의 정보는 ToString을 할때 위험한 부분이 있다. exclude 어노테이션을 잘 사용해서 로그를출력할때나 값을 가져올때 순환참조를 피해야 한다 @T.. 2022. 5. 30. 백엔드 개발 시 테스트 코드가 있어야 하는 이유 아직까지도 테스트코드가 없는 회사들이 많다 여러 이유들을 들어보면 개발 속도가 느려진다, 실제 서비스개발을 하는 것이 아니다 등등을 이유로 댄다 난 주니어 개발자이다. 개인적으로 TDD를 하면 좋겠지만, TDD까지는 바라지 않는다 (TDD란 Test Driven Development이며 실패하는 테스트 코드를 만든 후 성공을 위한 코드를 만든다) 실제로 개발을 하면 개발자가 모든 입력값을 검증할 수 없다 프론트 단에서 null이 넘어올지 ''(empty string)이 넘어올지, undefined가 입력값으로 넘어올지 모르는 일이다 어느날 프론트 직원이 나한테 물어봤다. "이 입력 폼을 123에서 ''로 비워놔도 동작이 되나요?" MSA 프로젝트라서 그 모듈 api를 열어서 컨트롤러로 가고 입력값 DTO.. 2022. 5. 5. 스프링 시큐리티 + 소셜로그인 구현(2) - 테스트해보기 일단 New Project에서 Spring Initializer로 시작하겠다 대충 Gradle로 만들고 DB는 일단 나중에 붙여도 되므로 Lombok, Spring Web, Thymleaf, Spring Security, OAuth2 Client를 선택해주고 Finish를 눌러준다 File에 Preferences를 선택해서 Build - Build Tools - Gradle에서 저기 두 부분을 IntelliJ IDEA로 변경해준다 캐싱하고 뭐시기 등등 느리다고 알려져서 인텔리제이로 바꾸는게 빠르다고 한다 또한 롬복 플러그인을 설치 안하신분이 있다면 설치를 하자 추가로 어노테이션 처리 활성화도 해준다 File - Preferences - Compiler - Annotation Processors appli.. 2022. 4. 21. 스프링 시큐리티 + 소셜로그인 구현(1) - 앱 등록하고 키값 얻기 1. Google https://console.cloud.google.com/ 에 접속을 한다 위의 점 3개가 있는 화살표 부분을 클릭한다 새 프로젝트를 클릭한다 프로젝트 이름을 아무거나 짓고 만들기를 누른다 이 화면에서 왼쪽 막대기 3개를 누르고 API 및 서비스를 눌러준다 추가로 옆에 고정까지 해주면 좋다 API 및 서비스 화면으로 들어왔다. 왼쪽의 OAuth 동의 화면을 누르자 동의 화면에서 외부를 선택 후 만들기를 누른다 앱 등록 화면에서 필수값인 앱 이름, 사용자 지원 이메일, 개발자 연락처 정보를 입력하고 다음으로 넘어간다 여기에서는 승인된 도메인이 없어도 상관없다(테스트용 애플리케이션이기 때문, 실제 서비스에서는 필요) 범위에서 유저에게 받을 데이터를 정하는 것이다 범위 추가 또는 삭제를 눌.. 2022. 4. 18. 스프링 시큐리티 + 소셜로그인 구현(0) - 기본 정보 알기 Google, Facebook, Github, Kakao, Naver 전부 다 보여주겠다!! 내가 삽질해가며 얻은 결과들... 22년 중반의 글이다. 옛날 19 20년 글보고 베끼지 않았으니 안심해주세욧! 일단 시큐리티는 기본적으로 붙어있고, 게이트웨이를 쓰거나 모놀리식이라면 WebSecurityConfig에서 요청마다 인증을 필요/미필요하게 할건지 설정하는건 알거라 생각하므로... 넘어간다 스프링 시큐리티란? 인증, 인가를 기반으로 한 스프링 하위 프레임워크이다 인증(Authentication)은 간단히 말하면 로그인 인가(Authorization)는 간단히 말하면 내가 유저인데 어드민 권한으로 다른 사람의 계정 정보를 보거나 유저를 삭제할 수 없듯, 권한을 의미한다 OAuth(Open Authoriz.. 2022. 4. 14. Blocking/Non-Blocking & Sync/Async가 뭔데? 흔히들 글이나 그림으로 설명을 하기만 한다. 나는 그런 것보다 직접 눈으로 봐야 직성이 풀린다(기능 작성 or 테스트 코드) 자 그럼 WebClient와 함께 테스트를 해보겠다 Spring은 기본적으로 Blocking/Sync 방식으로 동작을 하고 Node.js가 Non-blocking/Async 방식으로 동작을 한다 비동기 방식은 순차처리를 지원하지않는다 순서가 중요한 처리는 동기방식으로 처리를 해야한다(또한 잠금이 필요한 경우) 비동기관련용어 - ajax, XMLHttpRequest, Callback, Promise... Blocking / Non-blocking 은 호출된 함수가 호출한 함수에게 제어권을 바로 주느냐 안주느냐, Sync / Async 는 호출된 함수의 종료를 호출한 함수가 처리하느냐.. 2022. 3. 23. Java/SpringBoot 메일을 보내는 방법들 Google SMTP 사용 추가로 공부하세요~! 안타깝지만 제 블로그 글이 아님..ㅎ - SMTP, POP3, IMAP 차이 https://m.blog.naver.com/ijoos/221742035684 SMTP, POP3, IMAP 차이 이번에는 SMTP, POP3, IMAP의 차이에 대해서 배워보고자 한다. SMTP SMTP는 Simple M... blog.naver.com - SSL, TSL 차이 https://ko.gadget-info.com/difference-between-ssl SSL과 TLS의 차이점 SSL과 TLS 간에는 약간의 차이점이 있습니다. SSL은 목적을 달성하기위한 가장 중요한 접근 방법이며 모든 브라우저에서 지원됩니다. TLS는 보안 및 개인 정보 보호 기능이 강화 된 후속 .. 2022. 3. 23. OAS(Open Api Specification) - Swagger 그룹화, 각각 인증 표시하기 https://junho85.pe.kr/1583 Swagger. Springfox-Swagger 그리고 Springdoc 요즘 스프링으로 프로젝트를 하면서 이런저런 지식들을 습득하고 있습니다. 예전에 스프링으로 프로젝트하시던 분들이 swagger를 이용해서 API문서를 만들던 것을 보고 swagger라는 것에 대해 듣게 junho85.pe.kr 일단 Swagger는 Springfox-swagger 2.x 3.x버전과 Springdocs-OpenAPI 두개의 버전이 있습니다! 둘다 사용하는 Bean이 다른데요. 위처럼 TEST-API / 인증이 필요한 API / 인증이 불필요한 API 이렇게 그룹화를 할 수 있습니다. TEST-API에는 공통적으로 쓰이는 API를 두면 좋겠죠?(ComponentScan 등.. 2022. 3. 21. DTO instantiate (feat. Lombok, GET/POST) 여러분들은 아마 DTO에 값이 어떻게 채워져서 컨트롤러 메서드 내부의 인스턴스화된 오브젝트로 넘어오는지 궁금하지않나요? 제가 완벽히는 아니더라도 아는만큼 써놓겠습니다 오브젝트(객체)가 메모리에 올라와서 접근 가능하고, 처리 가능하게 되는 것을 인스턴스화된 객체, 인스턴스라고 합니다. 그럼 DTO는 언제 인스턴스화가 될까요? 기본적으로 Get 방식과 Post 방식은 스프링에서 처리 방식이 다릅니다 (이 밑부터는 반..말체 ㅎ) 1. Get Request + DTO Get요청에서의 DTO들은 모두 다 QueryString으로 들어간다 QueryString이란 ?{Key}={Value}&[Key}={Value} 방식으로 들어간다는 것이다 어차피 스프링에서 DTO로 만들어도 포스트맨 등에서는 Query Para.. 2022. 3. 10. Springboot local 환경에서 https 적용하기 라 말하고 사실 CA에서 인증받지 않은 짜가 인증서로...ㅎ 보통은 간단하게 하면 배포 전에 직접 인스턴스 서버에 들어가서 let's encrypt을 쓰던가 zeroSSL등 다른곳을 이용해서 인증서를 받을것이다 나는 keytool을 이용할것이다 자바폴더에 있기 때문에 윈도우는 bin 폴더에 환경 변수설정만, 맥은 기본적으로 잡혀있거나 아니면 .bashrc에다 추가해주면 된다 $> keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000 이름과 성을 입력하십시오. [Boki]: Boki 조직 단위 이름을 입력하십시오. [Boki]: Boki 조직 이름을 입력하십시오.. 2022. 3. 3. Springboot Security SpEL 을 활용한 @PreAuthorize SpEL(Spring Expression Language)란? Spring expression language는 보통 SpEL로 표기하며 구두로는 스프링 EL이라고 지칭한다 인증은 각각 서비스에서 정해지는 방법이 있을것이고 filter나 interceptor에서 거를 거라고 생각하고 api호출시의 권한체크, @PreAuhorize의 여러 방법들에 대해서 알아보려고 한다 0. 인증이 필요하지 않을 경우 @PreAuthorize("isAnonymous()") 익명이라는 뜻이다. 이 경우 인증을 거치지 않더라도 동작한다 @PreAuthorize("isAnonymous()") @GetMapping("/test0") public String test0() { return "test0"; } 1. 인증이 필요할 경.. 2022. 2. 26. 이전 1 2 다음