전체 글 54

아이템 58 전통적인 for 문보다는 for-each 문을 사용하라

- 무언가를 할 때 필요한 것이 원소 뿐이라면 인덱스 변수나 반복자들은 기능하는 곳 없이 오류 가능성을 높일 뿐이다. 그럴 때는 for-each 문을 사용하는 편이 낫다. - 그러나 for-each 문을 사용할 수 없는 상황이 세 가지 존재한다. 파괴적인 필터링(destructive filtering) - 컬렉션을 순회하면서 그 컬렉션의 원소를 제거. => ConcurrentModificationException이 발생한다. => Collection의 removeIf 메서드를 사용 public boolean removeIf(Predicate

아이템57 지역변수의 범위를 최소화하라

- 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기'다. - 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. - 반복자를 사용해야 하는 상황이면 for-each문 대신 전통적인 for문을 쓰는 것이 낫다. for의 괄호 안에 자동으로 반복하는 로직을 작성할 수 있기 때문이다. for (초기화식; 조건식; 증감식) { // 반복할 코드 블록 } - 변수를 반복문 종료 후에도 사용해야 하는 상황이 아니라면 변수 범위에 제한이 없는 while문 보다는 변수 범위를 최소화해주는 for문이나 for-each 형태를 쓰는 편이 낫다. 오류 가능성이 낮아진다. 그리고 컴파일 시점에도 오류를 잡을 수 있다. - 지역변수 범위를 최소화하는 마지막 방법은 메서드를 작게 유지하고 한 가..

@Transactional 그리고 Transaction marked as rollback-only 에러

Transaction rolled back because it has been marked as rollback-only 최근에 실무에서 에러 로그에 지속적으로 이 에러가 발생하는 것을 발견했다. 처리 상 문제는 없었으나 어쨌든 에러가 발생하고 있는 상황이니까 더 이상 발생하지 않게 처치를 해야했다. 그 당시 프로젝트는 서비스 계층 클래스에 전부 @Transactional 설정을 해버리는 aop가 되어 있었다. 그렇다보니 서비스에 있는 메소드들이 다 트랜잭션에 걸려있는 상태였다. 이런 구조 위에서 개별적으로 붙이는 @Transactional이 아닌 전체에 적용되어 버린 어노테이션 상황과 그 안에서의 try catch, 그리고 또 다시 throw 같은 복잡한 로직들 사이에서 저 에러가 발생하였다. 그 이슈..

스프링부트 + Mybatis 프로젝트에서 @Mapper 클래스가 bean 등록이 되지 않는 문제

발단 여러가지 테스트를 위해 새로운 스프링부트 gradle 프로젝트를 생성했다. 자바17에 스프링부트는 3.1.3 버전이었고 dependency들은 예전 프로젝트 환경설정들을 가져왔다. 그리고 정석대로 컨트롤러, 서비스, 매퍼, 매퍼xml을 생성하고 서버를 올렸는데 이런 에러가 발생했다. 분석 에러는 말 그대로 SampleService에서 SampleMapper를 DI 하려고 했는데 sampleMapper라는 bean이 없다는 뜻. 어노테이션 다 붙이고 패키지도 같은 패키지 안에 있는데 뭐가 문제일까. 어쨌든 컴포넌트 스캔 도중 스프링 빈 등록에서 누락되었을거니까 구체적으로 스캔 패키지를 명시해줘보았다. 이렇게 하면 정상 작동했다. 그러나 대체 왜? 기존에 알고있는 내용대로라면 같은 패키지 내에서는 빈 ..

스프링 DB 1편 정리

김영한님 강의 스프링 DB 1편 보고 정리해보기 1. 커넥션 풀 매번 DB에 접근하기 위해 커넥션을 연결하는데는 복잡한 과정과 반복되는 시간 및 리소스 소모가 발생한다. 이 문제를 해결하기 위해 커넥션 풀이라는 방법이 고안되었고 상용화되었다. 미리 커넥션을 생성해두고 클라이언트가 커넥션을 요구할 때 생성해 둔 커넥션을 사용한다. DB에 무한정 연결이 생성되는 것을 막아 DB를 보호하는 효과도 있다. 대표적인 커넥션 풀 오픈소스는 HikariCP등이 있다. springboot 프로젝트의 경우 기존 라이브러리에 포함되어 있다. dependencies에 라이브러리 추가 -> properties 파일 수정 -> DBConfig 파일 생성을 통해 HikariCP를 적용할 수 있다. 2. 트랜잭션 트랜잭션은 ACI..

자바8의 함수형 인터페이스(Functional Interfaces in Java 8)

이 포스팅은 https://www.baeldung.com/java-8-functional-interfaces의 번역 포스팅입니다. 1. 소개 이 튜토리얼은 자바8의 다양한 함수형 인터페이스를 가이드합니다. 2. 자바8의 람다 자바8은 람다표현식을 내놓으면서 코드의 엄청난 향상을 가져왔습니다. 람다는 우리가 1급 시민으로써 다룰수 있는 익명 함수입니다. 예를 들어, 우리는 람다를 전달하거나 어느 다른 메소드로부터 리턴 받을 수 있습니다. 자바8 이전에는, 캡슐화가 필요한 하나하나의 기능이 생길 때마다 클래스를 만들곤 했습니다. 이런 방식은 불필요한 문법식 코드를 내포하고 있었죠. “Lambda Expressions and Functional Interfaces: Tips and Best Practices”..

인터페이스에서의 static 메소드와 default 메소드(Static and Default Methods in Interfaces in Java)

이 포스팅은 https://www.baeldung.com/java-static-default-methods 포스팅의 번역 포스팅입니다. 1. 개요 자바8은 여러가지로 새로워졌습니다. 람다(lambda expressions), 함수형 인터페이스(functional interfaces), 메소드 참조(method references), 스트림(streams), 옵셔널(optional) 그리고 인터페이스의 static과 default 메소드가 그것들입니다. 이 포스팅에서는 인터페이스의 static과 default 메소드들을 어떻게 사용하고 활용할 수 있는지 다뤄볼 것 입니다. 2. 인터페이스에 default 메소드는 왜 필요한가 인터페이스의 일반 메소드들처럼 default 메소드는 암시적으로 public입니다..

[ 프로그래머스 : 정렬 ] 가장 큰 수

programmers.co.kr/learn/courses/30/lessons/42746 public static String solution(int[] numbers) { List list = new ArrayList(); for(Integer n : numbers) list.add(n); list.sort((o1, o2) -> { return (o2 + "" + o1).compareTo(o1 + "" + o2); }); return list.get(0) == 0 ? "0" : list.stream().map(n->String.valueOf(n)).collect(Collectors.joining()); } 이렇게 짧게 풀 수 있는 문젠데 ..ㅠ 첫 풀이는 너무 돌아돌아 갔다. 물론 속도는 겁나 느림. 그..

[모두의 네트워크] 7장 - 응용 계층 : 애플리케이션에 데이터 전송하기

응용 계층의 역할 응용 계층은 세션 계층과 표현 계층을 포함하는 것으로써 애플리케이션과 데이터를 주고받기 위해 필요한 계층이다. 클라이언트의 요청을 통신 대상(서버 등)이 이해할 수 있는 메시지(데이터)로 변환하고 전송 계층으로 전달하는 역할을 한다. 클라이언트 측 애플리케이션과 서버 측 애플리케이션이 통신하기 위해서는 응용 계층의 프로토콜을 사용해야 한다. 프로토콜 내용 HTTP 웹 사이트 접속 DNS 이름 해석 FTP 파일 전송 SMTP 메일 송신 POP3 메일 수신 위는 응용 계층의 대표적인 프로토콜들이다. 웹 서버의 구조(웹 사이트 접속) WWW란? WWW는 HTML, URL, HTTP라는 세 가지 기술이 사용된다. HTML은 마크업 언어이다. 클라이언트는 웹 사이트를 보기 위해 서버의 80번 포..

10분으로 내 깃허브(GitHub) 프로필 간지나게 꾸미기

프롤로그 친구의 혹은 동료의 혹은 지나가다 들른 어떤 이의 깃허브에서 이런 귀여운 그래프를 본 적이 없으신가요? 누구나 10분이면 만들 수 있는 그래프 프로필, 너도나도 추가해봅시다. 필수능력 : Git의 클론, 커밋, 푸시 정도는 할 줄 알아야함. 방법 1. 자신의 username/README.md 만들기 새 repository를 만듭니다. 이름을 내 username과 같은 이름을 쓰면 이런 깜찍한 README.md 추가에 대한 설명이 뜹니다. Public과 Add a README file에 체크하고 create를 합시다. 2. GitHub Profile Summary Cards 를 사용하기 github-profile-summary-cards 라는 멋진 툴을 만든 분이 계시므로, Star를 살포시 누른..

프로그래밍/Git 2020.10.25