java 13

Java PermGen의 역사

오늘은 Java PermGen에 대해서 알아보겠습니다. PermGen은 JDK 1.7 이하 버젼에서 존재하였습니다. 이곳은 클래스 메타 데이터가 들어갈 곳인데, 이 공간의 크기는 예측하기가 어려웠습니다. 자바에서는 클래스의 메타데이터를 읽고 해당 메타데이터를 통해 객체를 생성할 수 있습니다. 클래스 메타데이터란? : 클래스의 이름, 생성정보, 필드정보, 메서드 정보 등 그 때문에 아래와 같은 에러가 종종 일어나곤 했습니다. java.lang.OutOfMemoryError: PermGen space PermGen영역은 OS, JVM버젼마다 각기다른 default값을 가지고 있으며 대부분 매우 작게 할당되어 있었습니다. 그렇기 때문에 클래스 로딩을 많이하다보면 PermGen이 부족할때 위와 같은 에러가 발생..

DateTimeFormatter에서 년도표시에 yyyy대신 uuuu를 사용해야하는 이유?

DateTimeFormatter는 Java에서 datetime을 표시할때 가장 많이 사용하는 코드중 하나입니다. 보통 아래와 같은 코드로 표기하여 사용하는데요. LocalDate m = LocalDate.of(2018,12,31); String str = m.format(DateTimeFormatter.ofPattern("yyyy-MM"); //2018-12 선언한 pattern에 따라 LocalDate가 변경되어 String으로 반환되는 모습을 볼 수 있습니다. 위 pattern은 아래와 같은 특징을 가지는데요. 위 특징에 따라 보통 년도를 표시할때 yyyy를 사용하곤 합니다. 그런데 stackoverflow의 이 질문(링크)에서는 yyyy대신 uuuu를 사용하라고 합니다. 왜일까요? 서기, 기원전 표..

Kotlin 소개 및 Java와의 차이점 알아보기

What is Kotlin?# JetBrains에서 2011년 공개한 프로그래밍 언어# Java와 상호 호환 # JVM, Android, 브라우저에서 동작# coroutines 지원# Null 안정성 # 코틀린 공식 사이트 : https://kotlinlang.org/# 코틀린 온라인 공부 사이트 : https://play.kotlinlang.org Android와 Kotlin의 관계# Java와 100%호환을 통해 Android API그대로 사용가능# Ant, Maven, Gradle build 시스템 사용가능# Android studio를 통한 Java → Kotlin 변환도구 제공 Java vs Kotlinjava와 코틀린과 차이점을 정리해 보았다. 각 언어의 버젼별로, 상황별로 다른점이 많으나, ..

Java 시큐어 코딩 - 공격 종류 및 해결방안

1. SQL injection 취약점 발생 원인외부입력값을 동적으로 SQL실행문을 만들어서 사용할때 주로 나타남. /* SQL injection에 취약한 코드*/ String userId=request.getParameter("userId"); String password=request.getParameter("password"); ... Statement stmt = conn.createStatement(); ResultSet result = stmt.executeQuery("select count(*) as count from student where userid='"+userId+"' and password='"+password+"'"); userid에 admin' OR '1'='1 을 입력하면 그..

Spring boot에 AWS Elasticbeanstalk의 ebextensions 적용하기

Elasticbeanstalk란? Elasticbeanstalk는 Java, .NET, PHP, Node.js, Python, Ruby, Go, Docker를 사용하여 Apache, Nginx, Passenger, IIS와 같은 친숙한 서버에서 개발된 웹 애플리케이션 및 서비스를 간편하게 배포하고 조정할 수 있는 서비스이다. Tomcat 배포시 web server configuration?Spring boot MVC를 war package하여 Elasticbeanstalk(tomcat)을 통해 배포하면 자동으로 WAS, WEB 서버가 프로비져닝되어 배포된다. 아주 간편하고 쉬운 배포지만 was control 뿐만아니라 web server을 어떻게 컨트롤 할지 의문이든다. 이 때를 위하여 Elasticbe..

개발이야기/AWS 2018.11.19
Java reflection 사용시 에러 java.lang.ClassNotFoundException

Java reflection은 강력하고 Java를 더욱 효과적으로 쓸 수 있게 하는 무기이지만 아래와 같은 에러를 볼 때도 있다. java.lang.ClassNotFoundException: XXXXXX 아래 예제를 통해 어떻게 해결하는지 알아보자. Daemon.java1234567891011121314151617181920package com.reflection.example; import java.lang.reflect.Method; public class Daemon { public static void main(String[] args) throws Exception { try { Class c = Class.forName(args[0]); Method m[] = c.getDeclaredMetho..

Java의 축복 Lombok 소개 - gradle 적용시키기

Lombok Project는 Java프로젝트를 할때 필수적으로 깔고 시작해야할 툴 중 하나이다. Lombok없이는 Java프로젝트는 수많은 삽질과 노가다로 떡칠 되어있을 것이다. 왜 Lombok을 사용해야 하는지 아래 코드 예제들을 통해 알아보자. 1. 반복적인 코드제거Java는 훌륭한 언어이지만 코드를 반복적으로 써야하는 경우가 많다. Lombok은 이러한 반복적인 작업을 줄여준다. 만약 프로젝트가 Maven으로 이루어질 경우 아래와 같이 설정한다. (가장 최신 버젼의 추가방법은 이 웹페이지에서 확인가능하다) pom.xml12345678 org.projectlombok lombok 1.16.16 provided cs build.gradle(2.12이상의 gradle)1compileOnly "org.pr..

[Effective Java]가능하면 제네릭 자료형으로 만들 것

컬렉션 객체 선언을 제네릭화 하거나, JDK가 제공하는 제네릭 자료형과 메서드를 사용하는 것은 일반적으로 어렵지 않다. 그러나 제네릭 자료형을 직접만드는 것은 어렵지만 그래도 배워둘만한 가치가 있다. 1. 제네릭을 사용하지 않고 Object class를 활용하여 만든 Stack class12345678910111213141516171819public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void pu..

[Effective Java]무점검 경고(unchecked warning)를 제거하라

제네릭으로 프로그램하다보면 많은 컴파일러 경고메시지를 보게 된다. 아래가 그러한 경고이다. 무점검 형변환 경고(unchecked cast warning)무점검 메서드 호출 경고(unchecked method invocation warning)무점검 제네릭 배열 생성 경고(unchecked generic array creation warning)무점검 변환 경고(unchecked conversion warning)etc...제네릭에 대한 경험이 많고 코드에 대한 경험이 많다면 경고메시지가 줄어들지만 아직도 많은 제네릭 코드들이 경고메시지를 날리고 있다. 이러한 경고메시지를 제거하기 위해서 @SupressWarnings("unchecked") 어노테이션(annotation)을 사용해 억제한다. 하지만 @Su..

Java refactoring 자바 리펙토링 하루만에 파해치기

리펙토링강의 3/10OOP(Object Oriented Programming) 리펙토링중요한것 : operation(method) - interface등을 통해 전체 구조를 알 수 있기 때문더 중요한것 : 개발경험 - 개발경험을 통해서 다른 코드와 비교가 가능하기 때문(비교를 통해 불편&더러운 코드인 것을 파악)Java가 1.0->2.0->...->8.0 버젼이 올라가면서 달라지는 것을 직접 개발하는 것도 개발경험리펙토링겉으로 드러나는 기능은 그대로 - interface를 수정X @Override으로 메서드를 추가하여 구조변경을 하는게 중요!!코드 구조 변경 즉 기능추가X - like 자동차 튜닝가독성 높이고 유지보수 - 기존코드 절대 건드리면 안됨(특히 interface)오류해결은 리펙토링X기능추가 !..

[Effective Java]표준 예외를 사용하라

자바 플랫폼 라이블러리에는 대부분의 API가 필요로 하는 기본적인 unchecked exception들이 갖추어져 있다. 이미 있는 예외들은 재사용하면 아래와 같은 좋은 점이 있다. 1. 배우기 쉽고 사용하기 편리한 API를 만들 수 있다.2. 표준 예외를 사용한 API는 가독성이 높다.3. 예외 클래스 개수를 줄이면 프로그램의 메모리 요구량이 줄어들고, 클래스를 로딩하는 시간도 줄어든다.(확인 불가..) 아래는 가장 널리 재사용 되는 예외를 정리한 표이다. 예외 사용법 IllegalArgumentException null이 아닌 인자의 값이 잘못되었을 때 IllegalStateException 객체 상태가 메서드 호출을 처리하기에 적절치 않을 때 NullPointException null 값을 받으면 ..

[Effective Java]예외는 예외적 상황에만 사용하라

아래와 같은 코드를 써서 반복구문(loop)를 돌리는 개발자는 없다.(없어야만 한다) 문제점이 뭐냐? 크게 3가지로 볼 수 있다.(라고 책에 나와있다.) 1. 예외는 예외적 상황을 위해 설계된 것이므로 JVM수준에서 보면 빠르게 만들 필요가 없다.2. try-catch 블록안의 코드는 최신JVM의 최적화 기법 중 일부분이 적용되지 않는다.3. array 내부의 중복 검사가 이루어지지 않는다. 그런데 위 내용에서 추가적으로 책에서 설명한 부분이 있다. "사실 최신 JVM에서 돌려보면 예외를 통해 구현한 순환문이 표준적 순환문 보다 훨씬 느리다. 필자의 컴퓨터에서는, 100개 원소를 갖는 배열일 때 두 배 이상 느렸다." 라는 글을 보고 직접 실험해보기로 하였다. 1. for loop 2. try-catch..

[Effective Java]생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라.

규칙 2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라. Builder pattern은 객체에서 생성자에 들어갈 파라미터가 많든 적든 차례차례 파라미터를 받아들이고 모든 파라미터를 받은 뒤에 이 변수들을 통합해서 한번에 사용을 할 수 있다. 사진. 고도화된 빌더패턴 안드로이드에서도 이 패턴을 유용하게 많이 사용했는데, 이게 어떻게 이루어지고 사용을 했는지 몰랐다. AlertDialog가 그 예이다. 아래는 AlertDialog의 예시이다. 안드로이드를 하다보면 이 패턴을 자주보게 된다. AlertDialog 뿐만아니라 Uri, Geofence 등등 해당 패턴을 많이 사용하고 있다는 것을 알 수 있었다. 기존에는 오버로딩(Overloading)을 활용하여 객체를 생성했으나 이는 어떤 파라미터..