일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 카프카
- JavaScript
- docker
- JWT
- @jsonproperty
- 생성자 주입
- 스프링의 정석
- EC2
- visualvm
- MYSQL
- 남궁성과 끝까지 간다
- DB
- 패스트캠퍼스
- WEB SOCKET
- Kafka
- CentOS
- 스웨거
- Spring Security
- 프로그래머스
- AWS
- 개인프로젝트
- 항해99
- 스파르타코딩클럽
- Spring
- 웹개발
- 쇼트유알엘
- emqx
- java
- 데이터베이스
- 시큐리티
- Today
- Total
목록Back-end/java (28)
Nellie's Blog
실무에서 자주 마주치는 OOM 에러 모니터링 상태를 이해하고 메모리 누수, GC 문제가 일어나지 않도록 하기 위해 글을 작성해보았다.일부러 객체를 계속 할당하여 Heap 메모리를 과도하게 사용하게 하여 OOM 에러를 내보며 모니터링을 해보겠다. Cat 클래스계속 할당될 클래스다.package com.example.demo;/** OOM 에러 유발 코드 */public class Cat { private int age; public Cat(int age) { this.age = age; }} 메인 클래스계속 Cat 클래스를 할당해준다. package com.example.demo;import java.util.ArrayList;import java.util.List;imp..
아주 간단한 코드로 동시성 이슈를 유발해보고, synchronized를 사용해 초간단 해결을 해보는 과정을 통해 모니터링을 관찰하며 쓰레드와 리소스에 어떤 변화가 있는지 확인해보려고 한다. 실무에서 매우 중요한 부분이라서 실습을 해보겠다!동시성 이슈 유발 코드Producer 클래스package com.example.demo;import java.util.Random;import java.util.logging.Logger;/** 프로듀서 스레드는 리스트에 값을 추가한다. */public class Producer extends Thread{ private Logger log = Logger.getLogger(Producer.class.getName()); public Producer(St..
남궁성 저자의 자바의 정석을 보고 작성했다. 매번 찾아보는 것 보다 한 번 정리하고 두고 두고 보려고 만들어 보았다. 스트림의 중간연산 스트림의 최종연산
Http 요청 시 항상 보게되는 @RequestBody 어노테이션이 있다. @ModelAttribute 어노테이션과 항상 비교되는 어노테이션이다. 오늘은 @RequestBody만 딥하게 파보도록 하겠다. 지금까지는 @RequestBody를 '스프링 내부의 리플렉션으로 매핑을 해주며 JSON으로 요청이 가능하고 자바객체로 역직렬화를 해준다' 라고만 알고있었다. 더 들어가보자. @RequestBody 애너테이션의 역할은 클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환하는 것이다. HTTP 요청 본문 데이터는 Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환된다. 1. HttpMessageConverter 이동 @Reque..
앞의 두 글에 심화된 내용이다. 설정은 그대로 하고, 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..
단 두 줄만 써주면 된다. application.properties#logging file 경로 지정, 파일의 최대크기는 10mblogging.file.path=C:/error_loglogging.logback.rollingpolicy.max-file-size=10MB경로랑 파일 최대 크기만 지정해주면 끝! 자바 프로젝트가 실행할 때 생기는 모든 로그가지정한 경로에 spring_log 파일이 생성되어 그 안에 저장된다.
1. 종속성 추가implementation 'org.springframework.boot:spring-boot-starter-aop' 2. main 클래스에 @EnableAspectJAutoProxy 추가@EnableAspectJAutoProxy // AOP 활성화public class FirstApplication { public static void main(String[] args) { SpringApplication.run(FirstApplication.class, args); }} 3. AOP Aspect 클래스 생성package com.example.first.aop;import lombok.RequiredArgsConstructor;import lombok.extern..
평소처럼 자바 프로그램을 실행 시키는 중에 아래와 같은 에러가 났다.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..
페이징 처리는 막상 해보니, 크게 어려움은 없었는데 변수가 많아서 헷갈렸다. 가장 중요한 변수는 세가지 정도이다. 총 게시물 (boards), 페이지 사이즈 (한 페이지에 담기는 게시물 수, pageSize), 총 페이지 수(총 게시물을 페이지사이즈로 나눈 수, totalPages) 기본적으로 페이지 사이즈는 10으로 잡는다. 나도 10으로 잡았다. 1. BoardController // 게시판 글 조회 (페이징 처리 된) @GetMapping public String getAllBoards(Model model, @RequestParam(defaultValue = "1") int currentPage) { int pageSize = 10; // 페이지당 게시물 수 List boards = boardSe..
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..
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(페이징) 처리 및 적용게시판에서 게시물 리스트를 가져올 때 가져올 게시물 리스트 수를 지정하여 가져오지 않으면..
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..
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..
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}
HomeController // 4. 로그인 화면 @GetMapping("/login") public String loginForm() { return "login"; } // 4. 로그인 @ResponseBody @PostMapping("/loginTest") public UserDto login(@RequestBody UserDto userDto) throws UserException {// Object a = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); System.out.println("TEST"); System.out.pr..
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..
https://7942yongdae.tistory.com/86 HTML - 부트스트랩으로 회원가입 양식(Form) 화면 만들기 이번에는 간단한 회원가입 양식(Form) 화면을 만들어 보려고 합니다. 단순히 HTML만 사용하지 않고, UI 라이브러리인 Bootstrap도 이용해서 조금 더 유려하고, 유효성 검사까지 포함한 회원가입 폼을 7942yongdae.tistory.com
http://postcode.map.daum.net/guide Daum 우편번호 서비스 우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다. postcode.map.daum.net 카카오 공식문서에서 제공하는 api 예시 코드이다. 내가 작성한 register.jsp 코드 회원가입 이름 이름을 입력해주세요. 별명 별명을 입력해주세요. 주소 입력 우편번호 도로명 주소 상세주소 이메일 이메일을 입력해주세요. 인증 인증번호 인증번호를 입력해주세요. 비밀번호 비밀번호를 입력해주세요. 비밀번호 확인 비밀번호를 다시 입력해주세요. 휴대폰 번호 휴대폰 번호를 입력해주세요. 프로필 사진 이미지 파일을..
build.gradle에서 아래의 의존성 버전만 지워줌!! // implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:10.1.11' implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' 해결완료!
회원가입 시 아래 에러가 남 에러가 난 상태의 코드.. 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..
homeController package com.example.first.controller; import com.example.first.dto.TestDto; import com.example.first.dto.UserDto; import com.example.first.dto.UserRequestDto; import com.example.first.service.UserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.util.MultiValueMap; import o..
jar를 재배포하는 과정에서 이전의 jar파일이 실행되고 있어서 오류가 났다. Web server failed to start. Port 8080 was already in use. 라는 문구가 나왔다. 이전에 실행시켰던 서버를 끄는 방법을 정리해보았다. 1. 실행중인 프로세스 찾기 ps -ef | grep [파일명] 또는 ps -ef (전체 실행중 프로세스 보기) 2. 8080의 포트를 사용하는 프로세스 검색하기 netstat -anp |grep 8080 3. 8080의 포트를 사용하는 PID 검색하기 fuser -n tcp 8080 4. 해당 PID 강제 종료 kill -9 [해당 PID] 1번 명령어 다시 실행하여 종료되었는지 확인 후, 재 배포 하면 된다. 나의 경우 1,4번만 실행해서 종료했다...
컬렉션 프레임워크란? 자료구조(Data Structure) 를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있게 한 인터페이스와 구현클래스 java.util 패키지에서 제공하는 프레임워크 배열은 선언 시 정한 크기(정한 용량)를 변경할 수 없고, 항목을 저장, 삭제, 추가하는 메소드가 없기 때문에 직접 인덱스를 사용해야 했던 불편함을 해결하기 위해 제공된 프레임워크 주요 인터페이스 : List, Set, Map List 컬렉션 배열과 비슷하게 객체를 인덱스로 관리 배열과의 차이점 : 저장용량이 자동으로 증가, 객체를 저장할 때 자동 인덱스가 부여됨 객체 자체를 저장하는 것이 아닌 객체의 번지를 참조하며, 동일한 객체가 중복저장시 동일한 번지가 참조됨 ArrayList, Vector, Linked..
1. 예외 클래스 예외란, 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는프로그램 오류. 자바는 예외가 발생할 가능성이 높은 코드를 컴파일 할 때 예외 처리 유무를 확인한다. 만약 예외 처리 코드가 없다면 컴파일이 되지 않는다. 예외의 두가지 종류 일반예외 - Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스 - 컴파일러 체크 예외 (컴파일러가 미리 체크를 해준다) - 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사한다. - 예외처리 코드가 없다면 컴파일 오류 발생. 실행예외 - RuntimeException의 하위 클래스 - 컴파일러 넌 체크 예외 - 실행 시 예측할 수 없이 갑자기 발생하기 때문..
1. 참조 타입과 참조 변수 자바의 타입은 크게 기본타입과 참조타입으로 분류된다. 참조타입이란 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스를 말한다. 메모리 사용 영역 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음과 같이 세부 영역으로 구분해서 사용한다. - 메소드 영역 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역. 코드에서 사용되는 클래스(.class)들을 클래스 로더로 읽어 클래스별로 정적 필드(static field)와 상수, 메소드 코드, 생성자코드 등을 분류해서 저장한다. - 힙 영역 객체와 배열이 생성되는 영역. 만약 참조하는 변수나 필드가 없다면 의미없는 객체가 되기 때문에 JVM이 쓰레기로 취급하고 쓰레기수집기(Garb..
1. 조건문 - if 문, switch문 switch문은 if문처럼 조건식이 true일때만 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행된다. 변수의 값에 따라서 실행문이 결정되기 때문에 코드가 간결하다. 2. 반복문 - for문, while문, do-while문 while문에 true를 사용하면 무한루프를 돌게된다. 종료시키려면 변수의 값을 false로 만들거나, break문을 이용한다. - 문제 (while문작성. p161) - 정답 public class hh { public static void main(String[] args) { while(true) { int a = (int)(Math.random() * 6 ); int b = (int)(Math.random() * 6 ); ..
1. 연산자와 연산식 연산의 우선순위 산술 → 비교 → 논리 → 대입 연산자 산술 : + - * / % 비교 : == > 0 && y 0, y 90) ? "A" : "B"; 논리연산자 &와 &&의 차이 &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false라는 산출 결과를 낸다. &는 두 피연산자 모두를 평가해서 산출 결과를 낸다. 따라서 &&가 더 효율적이다. - ..
챕터1. 자바 환경설정 - 소스파일 : 프로그래밍 언어로 작성된 파일 - JDK가 설치되면 기본적으로 C:\Program Files\java 폴더가 생성된다. - 자바 컴파일러와 실행 명령어는 JDK 설치 폴더\bin 폴더에 있다. - JDK는 Java SE(Standard Edition)라는 스펙을 준수해서 만들어지므로 JDK버전과 Java SE버전은 동일하다. Java SE버전 표기 방식 : Java SE (주버전).(개선버전).(업데이트버전).((장기지원서비스버전)) - JDK 설치 폴더 안의 bin폴더를 Path환경변수에 등록하는 이유는 다른 경로에서 bin폴더 안에 있는 명령어를 사용할 수 있도록 하기 위함이다. 챕터2. 변수와 타입 자동타입변환 (기본타입을 크기순 정렬) byte < short..