본문 바로가기
관리자

Programming-[Backend]

(394)
자바 입력 : InputStream, InputStreamReader, BufferedStream, Scanner 자바의 기본 입력 API인 InputStream 등에 대해서 학습한다. 참조1의 설명이 잘 나와있어서, 그대로 따라해보며 기록 하였다. 1. Stream Stream은 마치 물이 연속적으로 흐르는 것과 같이 데이터가 연속적으로 존재한다는 것을 표현한 객체이다. 컴퓨터는 이진수로 이루어진 비트로 정보를 주고 받으며, 일반적으로 바이트코드(byte)로 데이터를 전달하기 때문에 스트림도 byte의 연속된 집합이라고 할 수 있다. 사용자의 키보드 입력, 파일 데이터, HTTP 송수신 데이터 등이 모두 스트림으로 간주되어 스트림 관련 API를 통해서 데이터를 처리하게 된다. 2. InputStream InputStream은 1996년 JDK 1.0에서 도입되었다. java.io 패키지에 속해 있다. InputSt..
@SpringBootApplication 이해하기 1. @SpringBootApplication 소개 IntelliJ IDE에서 Spring Initializr를 통해 프로젝트를 새로 생성하면, 따로 Spring 관련 라이브러리들(ex. Spring Web 등)을 추가해주지 않더라도 java/main 메서드의 최상위 클래스 위에 @SpringBootApplication 어노테이션이 설정된다. 이 글에서는 해당 어노테이션의 기능에 대해서 정리해보고자 한다. 2. @SpringBootApplication의 기능 @SpringBootApplication은 Spring Bean 설정 기능과 라이브러리들의 의존성 추가 작업을 해준다. 즉 @EnableAutoConfiguration, @Configuration, @ComponentScan 어노테이션이 주 기능이라..
[탐험][자바 스프링 Http 통신하기] 1. URL Connection Java/Spring을 활용하여 외부 Http 서버에 요청을 보내고, REST 통신을 하기 위한 방법들을 정리한다. 오래된 기술 순으로 나열하면 다음과 같다. URLConnection HttpClient RestTemplate WebClient 실제 Spring 프로젝트를 만들어서 Http 요청/응답 처리를 해보며 각 라이브러리의 사용법 및 장단점 등을 공부해본다. 그 외 부수적으로 초보 개발자가 얻어갈 수 있는 내용들을 정리할 것이다. project stack : java 17, spring boot 2.7.0, maven 4.0.0 / IDE : intellij Ultimate 1. URLConnection 소개 jdk 1.2부터 내장되었다. jdk 1.2는 1998년 Jave SE 1.2로 발표되었..
에러 발생 시 특정 기능을 하도록 만들기 : 정적 팩토리 메서드 1. 필요성 에러가 발생했을 때, 에러 객체를 만들면서 동시에 메시지를 쏘는 기능을 하도록 만들어야했다. 에러 객체를 new 키워드를 써서 생성자를 통해 만들어주고, 이후에 메시지를 쏴야하는데 이미 에러는 throw 되어 그 다음 코드는 실행하지 않게 되었다. if(error) { throw new MessageException("에러 발생"); sendMessage(); //실행되지 않음 } 2. 해결방법 MessageException 객체의 생성자 자체에 sendMessage 로직을 넣어주면 된다! 그러나 이런 경우에는 의미를 명확하게 하기 위해서 MessageException 객체가 정적 팩토리 메서드로 만들어지도록 하는 것이 추천된다. public static MessageException get..
[TIL][링크] 자바 리스트 stream split 처리 - groupingBy Java8 Collectors groupingBy Map groups = testList.stream().collect(Collectors.groupingBy(i -> i / 3)); List listByCollectors = new ArrayList(groups.values()); //will be.. listByCollectors = {ArrayList@1058} size = 4 0 = {ArrayList@1093} size = 3 1 = {ArrayList@1094} size = 3 2 = {ArrayList@1095} size = 3 3 = {ArrayList@1096} size = 1 출처: https://jinseongsoft.tistory.com/312 [진성 소프트]
[SQLD]12. SQL 기본 8 - 옵티마이저, 실행 계획, 인덱스 1. 옵티마이저 옵티마이저는 개발자가 작성한 SQL문을 어떻게 실행할 것인지 계획하고 최적화하는 역할을 한다. 간단한 예로, 2개의 테이블을 조인할 때는 기준이 되는 FROM절의 테이블(Outer table)의 인스턴스의 숫자가 적을 때 두 테이블간 외래키 비교 연산이 적으므로 속도가 향상될 수 있다. 이런 경우 혹시 개발자가 많은 양의 데이터를 갖는 테이블을 FROM 테이블로 설정하더라도 SQL문을 변형하여 최적화해주는 것이 옵티마이저이다. 옵티마이저는 최적화 결과를 실행 계획(Execution Plan)에 저장한다. IDE별로 이 Execution plan을 볼 수 있는 tool을 제공한다. IntelliJ에서는 Explain Plan 이라는 메뉴로 제공한다. 조인 방법뿐 아니라 데이터의 개수, 연산..
[SQLD]11. SQL 기본 7 - GROUP BY, ROLLUP, CUBE, WINDOW, RANK, FIRST_VALUE, LAG, PERCENT_RANK 등 1. 그룹함수 ROLLUP ROLLUP은 GROUP BY의 컬럼에 대해서 subtotal을 만들어준다. 예시1) SELECT DECODE(DEPTNO, NULL, '전체합계', DEPTNO), SUM(SAL) FROM EMP GROUP BY ROLLUP(DEPTNO); Oracle에서 제공하는 DECODE구문을 사용해서 DEPNO가 NULL일때는 '전체합계', 아니면 DEPNO를 표시하도록 해주었다. MSSQL에서는 'IIF(조건, 참일때 값, 거짓일때 값)' 함수를 사용하면 된다. 예시2) SELECT DEPTNO, JOB, SUM(SAL) FROM EMP GROUP BY ROLLUP(DEPTNO, JOB); 각 부서, 직업별 합계가 SUM_SAL 컬럼의 값으로 표시되었다. 각 부서별 합계는 JOB이 ..
[TIL] 스프링 트랜잭션 따로 적용 하기 (REQUIRES_NEW), 클래스 분리 필요 스프링에서 트랜잭션을 분리하고 싶을 때, @Transactional(propagation = Propagation.REQUIRES_NEW)로 트랜잭션을 분리하고자 하는 메서드에 어노테이션을 달아주면된다. 이외에도 @Transactional을 분리하는 종류에 대해서는 이전에 정리했었다. [TIL][링크] 트랜잭션의 전파, Spring @Transactional 중첩 그러나 이때, 트랜잭션을 분리하고자 하는 메서드를 반드시 클래스를 분리해서 적용해야한다. 이것은 @Transactional 어노테이션이 Spring의 CGLIB Proxy를 기반으로 동작하기 때문이다. 다시 말해 동일한 Bean으로 등록된 클래스의 메서드에서는 @Transactional을 단일 건으로 취급한다. Proxy로 불러온 빈은 다른 클..