스타트업 14

[Kotlin]코틀린1.8.0에서 새롭게 업데이트 된 기능

CBRT Function cube root의 단축어로 세제곱근이라는 뜻이다 import kotlin.math.cbrt val num = 24 val negNum = -num println("The cube root of ${num.toDouble()} is: ${cbrt(num.toDouble())}") println("The cube root of ${negNum.toDouble()} is: ${cbrt(negNum.toDouble())}") 매개변수로 double 과 float를 받아들이고 함수를 가져오고 double 또는 float값을 제공하면 된다. Eg) ${cbrt(num.toDouble())}") , ${cbrt(negNum.toDouble())}") @SinceKotlin("1.8") @W..

[Docker] docker 기본 명령어

버전 확인 $ docker -v 이미지 다운로드 $ docker pull [이미지 명] 다운로드된 이미지 목록 $ docker images 컨테이너 생성 $ docker create [옵션] [이미지 명] 컨테이너 생성 및 실행 $ docker run [옵션] [이미지 명] 컨테이너 실행 $ docker start [컨테이너 명] 컨테이너 재실행 $ docker restart [컨테이너 명] 컨테이너 접속 $ docker attach [컨테이너 명] 컨테이너 정지 $ docker stop [컨테이너 명] 실행중인 컨테이너 목록 $ docker ps 정지된 컨테이너 목록 $ docker ps -a 컨테이너 명 변경 $ docker rename [기존 컨테이너 명] [새로운 컨테이너 명] 컨테이너 삭제 $ ..

DevOps/docker 2023.01.06

AOP 입문자를 위한 기초 개념 : Spring을 사용하지 않는 AOP 구현 방법

AOP란? 관점 지향 프로그래밍이란 OOP로 독립적으로 분리하기 어려운 부가 기능을 모듈화하는 방식이다. 이 글에서 트랜잭션 관리와 같은 부분이 바로 부가 기능 모듈이며, 이를 Aspect라고 한다. AOP는 핵심 비즈니스 로직과 부가 기능 Aspect를 분리하는 등 OOP를 보완하는 역할을 한다. Cross-cutting-Concern (로그처리, 보안처리, 트렌젝션처리)을 소스코드에 로그처리, 보안처리하는 코드를 다 하나하나 넣어줘야했다. 그러면 필요시에 의해서 하나하나 처리를 해줘야하기 때문에 유지보수가 힘들어진다. 과거의 방식을 유지보수에 용이하게 보완하기 위해 등장한 방법이 바로 AOP이다. Cross-cutting-Concern (로그처리, 보안처리, 트렌젝션처리)과 Core Concern(주..

DesignPattern 2022.12.29

[queryDsl] Q-type Class 는 도대체 왜 만드는건가?

Q-type class QueryDSL 설정을 성공하면 @Entity가 붙은 클래스를 찾아 자동생성된다. 예를 들어 @Entity가붙은 Member.kt 클래스가 있다면 QMember.kt 파일이 자동생성된다. repositoryImpl에서 쿼리를 날릴때 메소드 기반으로 쿼리를 작성할 때 우리가 만든 도메인 클래스 구조를 설명해주는 메타데이터역할을 하며 쿼리의 조건을 설정할 때 사용하려고 만드는것이였다. 작성글 삭제하는 쿼리이다. @Entity가붙은 Member.kt 클래스가 있다면 QMember.kt 파일이 자동생성되면서 알아서 객체 이름만 맞춰준다면 쿼리를 코드처럼 편하게 짤 수 있다. override fun deleteBoard(userId: Long, board_id: Long): Boolean ..

[ProblemSolver] @Transactional(readOnly = true)는 왜 필요한가?

회사에서 소스코드를 분석하고 에제코드를 작성해보면서 단순히 왜 쓰는지에 대해 이해도가 전혀없이 @Transactional(readOnly = true) 을 주었다. 트렌젝션 일어나는 insert, update, delete 에는 쓰기가 가능하도록 별도록 @Transaction 어노테이션을 메서드에 선언해야한다. Class Level에는 공통적으로 적용되는 읽기전용인 @Transacrtion (readOnly = true) 어노테이션을 선언만하고 실행을 시켜본 결과 당연히 되지않았다. 그래놓고 왜 update가 왜 안될까 고민하고 있었다. 아래와 같이 트렌젝션 일어나는 insert, update, delete 에는 쓰기가 가능하도록 @Transactional 어노테이션을 달아줘야한다. @Service @T..

네트워크와 CS 2022.10.24

[queryDsl] queryDsl에서 데이터 insert하는 방법

queryDsl QueryDSL을 사용하여 쿼리를 Build 하기 위해서는 JPAQueryFactory가 필요하다. JPAQueryFactory를 사용하면 EntityManager를 통해서 질의가 처리되고, JPQL을 사용한다. EntityManager? JPAQueryFactory는 insert()를 가지고 있지않기 때문에 insert를 하려면 EnityManager를 사용한다. @Service @Transactional(readOnly = true) class BoardServiceImpl( val boardRepository: BoardRepository, val em: EntityManager ) : BoardService { /** 작성글 작성 **/ @Transactional override ..

[SpringSecurity] 쿼리낭비하지않는 코드: @AuthenticationPrincipal 쓰지않으면서

지난주에는 JWT Token을 이용하여 로그인 기능을 구현하는 연습을 하면서 기본CRUD에 유저정보를 넣는 작업을 하기위해 알아보면서 @AuthenticationPrincipal 어노테이션에 대해 알게되었습니다, 하지만 더 좋은 방법을 동료에게 추천을 받았다. @AuthenticationPrincipal을 함으로서 User엔티티를 한번더 불러와 select쿼리가 낭비되는 것보다는 DTO역할 분리를 하고자하는 로직에 따라 분리하여 충분히 update쿼리 하나만으로도 어노테이션없이 쿼리낭비를 하지않으면서도 효울적이게 코드를 작성할 수 있다. . @AuthenticationPrincipal 기존에는 로그인한 사용자의 정보를 파라메터로 받고 싶을때 @AuthenticationPrincipal 애노테이션을 사용하..

JPA 사용할 때 주의해야할 점 2편_관계매핑의 정의와 mappedBy 이해하기

그렇다면 양방향 관계 해결 방법은?? Entity01 BookStore @Entity @Getter @Setter public calss BookStore { @Id @GenerateValue private Integer id; private String name; @OneToMany(mappedBy ="bookStore") private Set books = new HashSet(); //add 메세지로 책을 책방에 추가한 것 void add(Book book){ book.setBookStore(this); this.books.add(book); } } book.setBookStore(this); 의 의미는 무엇일까? book.setBookStore(this); 를 추가하고 실행시키면 데이터 베이스 결..