Back-end Skill/Springboot 21

스프링을 사용하여 로그를 남기고 로그 파일 추출하는 법

slf4j 를 사용하여 로그를 남기는 방법 import org.slf4j.LoggerFactory import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController @RestController class LogController { private val logger = LoggerFactory.getLogger("LoggerController 의 소피로그") @GetMapping("/log") fun log() { logger.info("~~~~~~~~~~Hi ALLL~~~~ SophieLog ~~~~~~") logger.error("~~~~~~~~~~Hi ..

[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..

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

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

면접 스터디 2주차 자바와 스프링 프레임워크

자바란 무엇일까? 객체지향프로그래밍(OOP: Object Oriented Programming) 언어이다. 자바의 장점은? - 그로인해 유지보수가 쉽고 직관적인 코드 분석이 가능하다. - 분산 네트워크 기술을 지원한다. -자바에는 TCP/IP 라이브러리가 기본적으로 포함되어있고, HTTP 프로토콜을 지원한다. -멀티쓰레딩을 지원한다. - 동일한 쓰레드를 동시에 수행할 수 있다. - 사용자 인터페이스 쓰레드와 장시간 계산이 필요한 쓰레드가 동시에 필요할 때 효과적이다. - 이식성이 높다. - 자바가상머신(JVM)에서 작동하기 때문에 운영체제 (ex. Window, Linux)의 종류에 상관없이 작동한다. - 자동 메모리 관리(Garbage Collecter) 사용하지 않는 객체는 자동으로 메모리에서 체크하..

스프링 MVC 정리본 1

1) Spring Annotation 어노테이션설명 @Controller 스프링 MVC의 컨트롤러 객체임을 명시하는 어노테이션 @RequestMapping 특정 URI에 매칭되는 클래스나 메소드임을 명시하는 어노테이션 @RequestParam request의 파라미터를 가져오는 기능을 하며 메소드내에 변수로 활용 @RequestHeader 요청(request)에서 특정 HTTP헤더 정보를 추출할 때 사용 @PathVariable 메소드 파라미터 앞에 사용하며 해당 URL에 { } 특정 파라미터를 변수로 활용 가능 @CookieValue 현재 사용자의 쿠키가 존재하는 경우 쿠키 이름을 이용해서 쿠키 값을 추출 @ModelAttribute view에서 전달해주는 파라미터를 클래스의 멤버변수로 binding ..

스프링 세션8_ 빈 생명주기 콜백

빈 스코프란? 지금까지 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 다양한 스코프를 지원한다. 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 웹 관련 스코프 request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다. session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프 applicati..

스프링 세션8_ 빈 생명주기 콜백

데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 이번시간에는 스프링을 통해 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 예제로 알아보자. 간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해보자. 실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록 했다. 이 NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고 , 애플리케이션이 종료되면 disConnect() 를 호출해서 연결을 끊어야 한다 //예제 코드, 테스트 하위에 생성 package hello.core..

스프링 세션7_의존관계 자동 주입

//호출 안됨 @Autowired(required = false) public void setNoBean1(Member member) { System.out.println("setNoBean1 = " + member); } //null 호출 @Autowired public void setNoBean2(@Nullable Member member) { System.out.println("setNoBean2 = " + member); } //Optional.empty 호출 @Autowired(required = false) public void setNoBean3(Optional member) { System.out.println("setNoBean3 = " + member); } 의존관계 주입은 크게 4가지..

스프링 세션6_ 컴포넌트 스캔

컴포넌트 스캔을 사용하려면 먼저 @ComponentScan 을 설정 정보에 붙여주기 package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import static org.springframework.context.annotation.ComponentScan.*; @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTAT..