Back-end 101

[Springboot] 스프링 부트 자동구성의 동작 원리 파헤쳐보기 (@SpringBootApplication, @EnableAutoConfiguratioin, @Import, AutoConfigurationImportSelector)

어째서 스프링부트는 우리가 원하는 많은 Bean 들을 자동으로 등록해주는 것일까?  스프링부트가 해주었던 마법같은 동작을 하나하나 들여다보자. 사용한 기술 및 버전 스프링 부트 : 3.3.1자바 : 17IDE : IntelliJ Community @SpringBootApplication 을 따라 들어가 보기인텔리제이 프로젝트의 main 메서드가 있는 실행파일을 먼저 들어가보자.  순서대로 다음 어노테이션들을 @SpringBootApplication ⇒ @EnableAutoConfiguratioin ⇒ @Import({AutoConfigurationImportSelector.class}) 로 따라들어가보자.    @EnableAutoConfiguratioin 파일에 보면, @Import 어노테이션이 보인다..

Back-end/Spring 2024.09.28

[Springboot] 카멜케이스로 코드를 작성했는데 스네이크케이스로 요청이 온다면? (@JsonProperty, @JsonNaming)

카멜케이스로 코드를 작성했는데 스네이크케이스로 요청이 온다면 어떻게 할까?   Jackson 라이브러리에서 제공하는 ObjectMapper 객체는 어노테이션으로 @JsonProperty와 @JsonNaming 을 제공해준다.Snake Case 데이터를 받아, Camel Case 변수에 데이터를 바인딩 해준다.  스네이크케이스 말고도, 케밥케이스 등 많은 데이터와 매핑하는 기능을 제공한다.  예제로 실습을 해보자. 컨트롤러 @PostMapping("/test/test") public TestDto testTest(@RequestBody TestDto testDto) { return testDto; } 포스트맨 요청스네이크 케이스로 데이터를 post한다.post) http://localhost..

Back-end/Spring 2024.07.12

[Springboot] RestTemplate을 사용한 MSA 프로젝트 만들기 (서버간 통신, JPA, H2 DB, Scheduler, FileIO)

오늘은 RestTemplate을 사용하여 요즘 매우 핫하고 확장성이 뛰어난 MSA(Microservice Architecture) 프로젝트를 만들어 보았습니다.   WAS 2개를 사용하여 서버간 통신으로 데이터를 API로 전송하는 서비스를 구현하며 정리했습니다. (실제로 요구사항이 들어왔을 때를 가정하고 프로젝트를 만들어 보았습니다. )  📝 목차 1. 데이터를 전송하는 localhost:8081 서버와 API 만들기2. 데이터를 받는 localhost:8080 서버와 API 만들기3. 테스트  👇 RestTemplate 과 동기식 요청이란 더보기🙋‍♀️ RestTemplate 이란?HTTP 통신을 위한 도구로 RESTful API 웹 서비스와의 상호작용을 쉽게 외부 도메인에서 데이터를 가져오거나 ..

Back-end/Spring 2024.07.06

[JAVA/Springboot] open API 사용법(공공데이터)

1. OPEN API 신청 사용하고 싶은 오픈 API를 골라서 활용신청을 해준다. 나는 아래 사이트에서 영양정보를 제공하는 공공API를 사용하였다. https://www.data.go.kr/iim/api 활용신청 클릭 활용내용은 대충 '웹사이트 개발용' 이라고 적었다. 그러면 기다릴 필요도 없이 자동 승인이 되고, 인증키를 사용할 수 있게 된다. 참고문서의 .doc 파일을 보니 아주 자세히 요청을 어떻게 하는지 나와있다. 이렇게 해도 되지만, URL마지막 부분을 type=json으로 해주면 JSON으로 반환되어 편리하다. 아래처럼 호출해주었다. http://apis.data.go.kr/1470000/FoodNtrIrdntInfoService/getFoodNtrItdntList?ServiceKey=서비스키..

Back-end/Spring 2024.04.03

@RequestBody 호출 시 일어나는 일을 간단히 알아보기 (feat. MessageConverter, ObjectMapper)

Http 요청 시 항상 보게되는 @RequestBody 어노테이션이 있다. @ModelAttribute 어노테이션과 항상 비교되는 어노테이션이다. 오늘은 @RequestBody만 딥하게 파보도록 하겠다. 지금까지는 @RequestBody를 '스프링 내부의 리플렉션으로 매핑을 해주며 JSON으로 요청이 가능하고 자바객체로 역직렬화를 해준다' 라고만 알고있었다. 더 들어가보자. @RequestBody 애너테이션의 역할은 클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환하는 것이다. HTTP 요청 본문 데이터는 Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환된다. 1. HttpMessageConverter 이동 @Reque..

Back-end/java 2023.12.06

[Spring] 스프링을 구동하면 일어나는 일 / 생성자 주입을 사용해야 하는 이유 (스프링 빈 라이프사이클)

스프링을 구동 (run) 하면 일어나는 일들을 알아보며 생성자 주입과 필드 주입의 차이를 알아보자. 스프링을 구동하면 스프링은 스프링 빈 라이프사이클을 거치며, 7단계의 순서로 진행이 된다. 스프링 컨테이너 생성 → 빈 생성 → 의존성 주입 → 초기화 콜백 메서드 호출 → 사용 → 소멸 전 콜백 메서드 호출 → 스프링 종료 자세히 알아보자. 1. 스프링 컨테이너 생성 스프링을 구동하면 , 먼저 스프링 컨테이너가 생성이 된다. 컴포넌트스캔이나 @Bean 으로 등록된 클래스 등 빈으로 설정한 아이들을 스프링 컨테이너 생성과 함께 모두 빈으로 등록한다. 2. 빈 생성 스프링 컨테이너는 등록된 빈의 클래스를 기반으로 실제 빈 객체를 생성한다. 스프링을 실행(run) 하자마자 빈 등록과 빈 생성이 바로 이루어진다..

Back-end/Spring 2023.11.17

AOP를 사용하여 에러 로그 찍기

앞의 두 글에 심화된 내용이다. 설정은 그대로 하고,  package com.example.first.aop;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Aspect;import org.slf4j.Logger;import org.springframework.stereotype.Component;@Aspect@Component@Slf4j@RequiredArgsConstructorpublic..

Back-end/java 2023.09.26

빌드 중 NoSuchFileException 에러 미해결

평소처럼 자바 프로그램을 실행 시키는 중에 아래와 같은 에러가 났다.2023-09-26 09:23:02.151 WARN 23408 --- [ main] o.a.tomcat.util.scan.StandardJarScanner : Failed to scan [file:/C:/Users/weaver-gram-002/.gradle/caches/modules-2/files-2.1/com.oracle.database.security/oraclepki/21.3.0.0/oracle.osdt/osdt_cert.jar] from classloader hierarchyjava.io.IOException: java.lang.reflect.InvocationTargetException at org.apac..

Back-end/java 2023.09.26

게시판 페이징 기능 완료

페이징 처리는 막상 해보니, 크게 어려움은 없었는데 변수가 많아서 헷갈렸다. 가장 중요한 변수는 세가지 정도이다. 총 게시물 (boards), 페이지 사이즈 (한 페이지에 담기는 게시물 수, pageSize), 총 페이지 수(총 게시물을 페이지사이즈로 나눈 수, totalPages) 기본적으로 페이지 사이즈는 10으로 잡는다. 나도 10으로 잡았다. 1. BoardController // 게시판 글 조회 (페이징 처리 된) @GetMapping public String getAllBoards(Model model, @RequestParam(defaultValue = "1") int currentPage) { int pageSize = 10; // 페이지당 게시물 수 List boards = boardSe..

Back-end/java 2023.09.24

파일 업로드 기능 구현 중 에러 - IllegalStateException: File has been moved - cannot be read again

ERROR 14924 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: File has been moved - cannot be read again] with root causejava.lang.IllegalStateException: File has been moved - cannot be read again at org.springfr..

Back-end/java 2023.09.21

스프링 부트 페이징처리 (jsp, mybatis, postgresql)

https://congsong.tistory.com/26 스프링 부트(Spring Boot) - 페이징(Paging) & 검색(Search) 처리하기 1/2 [Thymeleaf, MariaDB, IntelliJ, Gradle, MyBat본 게시판 프로젝트는 단계별(step by step)로 진행되니, 이전 단계를 진행하시는 것을 권장드립니다. DBMS 툴은 DBeaver를 이용하며, DB는 MariaDB를 이용합니다. (MariaDB 설치하기) 화면 처리는 HTML5 기반congsong.tistory.com  https://carrotweb.tistory.com/257 Spring에 Paging(페이징) 처리 및 적용게시판에서 게시물 리스트를 가져올 때 가져올 게시물 리스트 수를 지정하여 가져오지 않으면..

Back-end/java 2023.09.21

스프링부트 로컬에서 이미지 불러오기

http://antananarivo.tistory.com/63 스프링, 로컬에서 이미지 불러오기 최종. 일주일을 해맸다. 정확히 말하면 5일.결론을 얻은것 같았는데 다시 원점으로 돌아오기를 반복... 그래도 결국 답을 찾아냈다.(스프링 버젼은 4.3, jdk는 1.8, tomcat은 8.0 버젼을 사용중임) 방법은 크 antananarivo.tistory.com 3가지 클래스만 수정해주면 된다. 1. HomeController @RequiredArgsConstructor @Controller @Slf4j @CrossOrigin public class HomeController { private final UserService userService; private final HomeMapper homeMa..

Back-end/java 2023.09.19

AbstractMethodError: Receiver class net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy does not define or inherit an implementation of the resolved method 'abstract java.lang.Object getObject(java.lang.String, java.lang.Class)' of interface java.sql.ResultSet.

https://momobob.tistory.com/23 [JDBC Error] log4jdbc를 이용한 DB설정 시 에러 해결 Spring boot에서 log4jdbc.sql.jdbcapi.DriverSpy 드라이버를 이용한 DB 설정시 아래와 같은 에러가 발생함 java.lang.RuntimeException: Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdbcUrl, jdbc:log4jdbc:oracle:thin:@l momobob.tistory.com https://makeaplayground.tistory.com/179 Spring Boot SQL 로그 설정 (Log4jdbc) Gradle 적용시키기 Log4jdbc Log..

Back-end/java 2023.09.19

DBeaver에서 컬럼명 언더바 오류 해결

1. mybatis-config.xml 아래 세팅 추가! // 아래 세팅 추가! 2. mapper.xml 으로 시작하는 설정 추가! DB에 있는 컬럼명을 현재 VO 명과 맞추는 작업이다. 그리고 원하는 쿼리로 내려가서, 만들어준 설정의 값(resultMap = "userResultMap") 을 넣어준다! SELECT "userId", password, name, username, nickname, phone_number, zipcode, street_adr, detail_adr FROM postgres.first_project.users WHERE username = #{username}

Back-end/java 2023.09.19

유효성 검사시 기존 작성 데이터가 사라지는 문제 해결

function register() { // e.preventDefault(); // 폼 제출 방지 // 1. 여기서 내가 화면에서 post 로 입력하는 정보를 하나하나 가져오기 var name = $('#name').val() var nickname = $('#nickname').val() var username = $('#username').val() var password = $('#password').val() var passwordConfirm = $('#passwordConfirm').val() var phoneNumber = $('#phoneNumber').val() var profilePicture = $('#profilePicture').val() var zipcode = $('#zipc..

Back-end/java 2023.09.14

카카오 주소 검색 api 로 회원가입 시 주소 입력하기 & 에러

http://postcode.map.daum.net/guide Daum 우편번호 서비스 우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다. postcode.map.daum.net 카카오 공식문서에서 제공하는 api 예시 코드이다. 내가 작성한 register.jsp 코드 회원가입 이름 이름을 입력해주세요. 별명 별명을 입력해주세요. 주소 입력 우편번호 도로명 주소 상세주소 이메일 이메일을 입력해주세요. 인증 인증번호 인증번호를 입력해주세요. 비밀번호 비밀번호를 입력해주세요. 비밀번호 확인 비밀번호를 다시 입력해주세요. 휴대폰 번호 휴대폰 번호를 입력해주세요. 프로필 사진 이미지 파일을..

Back-end/java 2023.09.13

UnsatisfiedDependencyException , NoClassDefFoundError 에러

회원가입 시 아래 에러가 남 에러가 난 상태의 코드.. Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2023-09-13T10:26:55.675+09:00 ERROR 11084 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'homeController' defined in file [C:\User..

Back-end/java 2023.09.13

[프로그래머스] 카드 뭉치 (java)

💁‍♀️ 문제 설명 코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다. 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다. 한 번 사용한 카드는 다시 사용할 수 없습니다. 카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다. 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다. 예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"..

Back-end/Algorithm 2023.08.20

[프로그래머스] 추억 점수 (java)

💁‍♀️ 문제 설명 사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["may", "kein", "kain"]이고 각 인물의 그리움 점수가 [5점, 10점, 1점]일 때 해당 사진의 추억 점수는 16(5 + 10 + 1)점이 됩니다. 다른 사진 속 인물의 이름이 ["kali", "mari", "don", "tony"]이고 ["kali", "mari", "don"]의 그리움 점수가 각각 [11점, 1점, 55점]]이고, "tony"는 그리움 점수가 없을 때, 이 사진의 추억 점수는 3명의 그리움 점수를 합한 67(11 + 1 + 55)점입니다. 그리워하는..

Back-end/Algorithm 2023.08.19

[프로그래머스] 햄버거 만들기 (java)

💁‍♀️ 문제 설명 햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다. 예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓..

Back-end/Algorithm 2023.08.18

[프로그래머스] 체육복 (java) - 그리디

💁‍♀️ 문제 설명 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solutio..

Back-end/Algorithm 2023.08.17

[프로그래머스] 모의고사 (java) - 완전탐색

💁‍♀️ 문제 설명 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution ..

Back-end/Algorithm 2023.08.16