소프트웨어엔지니어 12

[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 애노테이션을 사용하..

[Springboot] 데이터 인자를 넘겨받는 각기 어노테이션 : 목적으로 다르게 효율적으로 쓰일 수 있는 방법들

오늘은 form태그에서 컨트롤러에 인자를 할당하는 어노테이션 3가지에 대해 간단히 알아보고 실무에서는 어떻게 쓰이는지에 대해 알아보도록 하자. @RequestParam query 처리 전달받은 데이터를 URI상에서 찾는다. Type 1의 URI를 처리할 때 사용한다. GET 방식으로 넘어온 URI의 queryString을 받기 적절하다. @RequestBody로 데이터를 받을 경우 메소드의 파라미터명이 상관 없지만 @RequestParam으로 데이터를 받을 때는 데이터를 저장하는 이름으로 메소드의 파라미터명을 설정해줘야 한다. 해당하는 데이터만 받아올 수 있다. (@RequestBody는 객체를 받아옴) ex) http://localhost:8080/receive?name=sophie&age=23 @Pa..

[ProblemSolver] 개발 서버 구축하고 build 할 때 생기는 이슈들

안녕하세요. 스타트업으로 백엔드개발자로 이직한지 2주차입니다. 현재는 회사에서 사용하고 있는 백엔드 기술을 파악하고 소스코드를 분석하고 간단히 예제코드를 짜는 작업을 하며 업무 파악 중에 있습니다. 간단히 읊어보자면, 현재 회사에서는 Kotlin Web Server로 스프링부트를 사용하고 있고, JPA인 queryDSL을 사용하고 있습니다. 회사에서 사용하고 있는 백엔드 기술 기반으로 개발환경을 구축하고 코드작업을 하는데 지난 일주일동안 반복되는 에러를 경험하게되는 일 있었는데요. 그 때 겪은 이슈들을 공유해보고자합니다. 개인적으로 제일 어려운게 개발환경셋팅과 서버구축인것 같습니다. 1. 호환되지않는 다른 개발환경의 버전의 충돌 이슈 java, sdk, jdk , springboot 여러 개발 환경 버전..

네트워크와 CS 2022.10.23

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); 를 추가하고 실행시키면 데이터 베이스 결..

Hibernate JPA 사용할 때 주의해야할 점. 원리를 모르면 그냥 쓰지마세요 1편

QueryDSL?? QueryDSL은 정적 타입을 이용해서 SQL 등의 쿼리를 생성해주는 프레임워크이다. QueryDSL의 장점 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다. 자동 완성 등 IDE의 도움을 받을 수 있다. 동적인 쿼리 작성이 편리하다. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다. 잘못된 예제코드와 정상예제코드 작성을 통해 학습해보기 간단하게 entity가 두개가 있다. 이 둘은 양방향 관계이다. 일대다 양방향 관계이다. Entity01 BookStore @Entity @Getter @Setter public calss BookStore { @Id @GenerateValue private Integer id; privat..

MSA 아키텍쳐

"하나의 큰 어플리케이션을 여러개의 작은 어플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍쳐" 이것은 마치 레고놀이와 같다. 작은 레고블록(Microservice) 하나하나를 붙여 어떠한 큰 결과물을 만드는 형태를 MSA 라고한다. small services, each running in its own process(스스로 돌아 갈 수 있는 작은 서비스) 와, independently deployable(독립적 배포 가능) 이 MicroService를 설명해 줄 수 있는 가장 핵심적인 문구라고 생각합니다. microService의 정의 이 MicroService를 설명해 줄 수 있는 가장 핵심적인 문구 small services, each running in its own process(스스로..

DesignPattern 2022.10.05

디자인 패턴 SOLID : Open- closed principle 개방 폐쇄 원칙

Open- closed principle 개방 폐쇄 원칙 개방폐쇄법칙에 대해 알아보면 extension에 대해서는 open modification에 대해서는 closed라고 써있다. 확장에 대해서는 개방 수정에 대해서는 페쇄라는 뜻인데 전혀 감이 오지않습니다. 이게 코드에 대한 제안이 아니라 코드에 behaviour에 대한 principle이기 때문에 이해가 바로 와닿진 않는다. 예제코드를 써보면서 감을 잡도록하겠다. 먼저 open- closed를 준수하지않은 코드를 먼저 보자. # Animal 클래스 하나를 생성 class Animal: #내부에 그 동물의 그 타입 프로퍼티를 가지고 있는다. # a_type에는 코양이 혹은 강아지와 같은 동물의 종류를 넣는 것이다. def __inti__(self, a..

DesignPattern 2022.10.05

Python Pandas로 Excel 파일 불러오고 조회하는 방법

import pandas as pd import warnings import os warnings.simplefilter("ignore") fileDir = "C:/Users/SEEYA/Desktop/Data/구급일지/" # 파일경로+ 폴더명 fileNm = "AAA.csv" # 파일 이름 data = pd.read_csv(fileDir + fileNm, encoding='CP949') selectdata = pd.DataFrame(data, columns = ['재난번호','구급보고서번호']) #조회할 컬럼 지정해서 출력하고 싶을 때 print(selectdata)