개발이야기 118

유용한 Java 기반 Html Parsing Library : jsoup

jsoup jsoup는 Java HTML Parser이다. HTML parser로서 아주 편리하며 강력한 기능들을 가지고 있다. 어떤 html dom객체에 접근한다고 가정한다면 마치 jqeury를 쓰듯이 간단하게 접근가능하다. 자세한 예제는 아래에서 보이고자 한다.사이트 url : https://jsoup.org/jsoup doc url : https://jsoup.org/apidocs/ Example12Document doc = Jsoup.connect("http://en.wikipedia.org/").get();Elements newsHeadlines = doc.select("#mp-itn b a");cs 위와 같이 Jsoup객체에 connect를 사용하여 컨넥션을 맺고, get()을 통해 html ..

[iBatis] Integer isNotNull 사용하기

Dynamic SQL dynamic SQL은 ibatis를 사용하는데 있어서 매우 유용하다 파라미터의 값 상태에 따라서 여러 종류의 sql문을 변경할 수 있는데 아래 코드는 대표적인 dynamic select statement이다. 1234567 select * from ACCOUNT where ACC_ID = #Id# order by ACC_LAST_NAMEColored by Color Scriptercs 위 example은 Id 변수의 값 상태에 따라서 아래와 같은 두가지 SQL로 나올 수 있다. Id가 0보다 클 경우(존재할 경우)1select * from ACCOUNT where ACC_ID = ?cs ID가 0이거나 작을경우1select * from ACCOUNTcs 그런데 왜 Id가 존재하는지..

서블릿의 이해

서블릿의 이해 1997년 SUN사는 웹 서비스를 위한 기본 인터페이스로 서블릿을 제안했다. 또한 서블릿을 배치, 서비스하는 서버 구조로 서블릿 컨테이너의 개념을 전파하기 시작. 사용자가 원하는 비즈니스 서블릿 컨테이너에 해당 서블릿 구현을 배치라는 특별한 절차를 거쳐 등록하면 서블릿컨테이너가 네트워크 통신, 생명주기 관리, 스레드 기반의 병렬처리를 대행하겠다는 약속서블릿이란 무엇인가서블릿 : javax.servlet.Servlet 인터페이스를 구현한 것

서블릿 컨테이너을 위한 웹 애플리케이션 서버와 HTTP프로토콜의 이해

서블릿 컨테이너에서의 WAS와 HTTP웹 애플리케이션 서버의 역할웹 프로그램 : HTTP프로토콜로 통신하는 네트워크 프로그램의 일종웹 애플리케이션 서버 : 클라이언트와 서버간의 소켓통신에 필요한 TCP/IP 연결 관리와 HTTP 프로토콜 해석 등의 네트워크 기반 작업을 추상화해 일종의 실행환경을 제공원래는 Java EE 명세를 만족시키는 Java 구현체를 의미하짐나, 최근에는 개념이 일반화되면서 자바 이외의 프로그래밍 언어로 작성한 서버도 웹 애플리케이션 서버라고 부름서블릿 컨테이너여러 경량 프레임 워크(ex. struts, Spring 등)는 Java EE 정의 중 웹 애플리케이션 기술(JSP, 서블릿, Javaserver Faces, JSTL 등) 위에서 동작한다. 이 때 웹 애플리케이션 기술에 대한..

automator로 멋진 맥북 배경화면 얻기 꿀팁

automator로 멋진 맥북 배경화면 얻기automator는 맥북에 기본으로 들어있는 Macro프로그램이다. 다양한 옵션을 통해서 사용자가 원하는 입출력을 만들 수 있고, 애플리케이션(응용프로그램)으로도 만들 수 있다.이 automator을 사용하여 멋진 배경화면을 만드는 프로그램을 1분만에 만들어 보자. 준비물맥북safari1 minutesautomator 애플리케이션 만들기 맥북을 켜서 Launchpad -> 기타에 들어가면 Automator라고 귀여운 봇이 있다 클릭. 응용 프로그램을 만들어야하므로 '응용 프로그램'을 선택 많은 좋은 배경화면 사이트들이 있지만 이번에는 Unsplash.com의 api를 사용하여배경화면을 설정하고자 한다. Unsplash.com API 포스트 보러가기 safari를..

안드로이드 HandlerThread 스레드 사용법

Android HandlerThread android HandlerThread는 Thread class를 상속하고 내부에서 Looper.preapare()과 Looper.loop()를 실행하는 Looper 쓰레드이다. HandlerThread는 UI와 관련없지만 단일스레드에서 순차적인 작업이 필요할 때 사용한다. Example) 상기와 같이 인스타그램에 좋아요 버튼이 있다. 좋아요 버튼을 누르면 실시간으로 DB에 반영된다고 가정하자. 개발자는 UI를 블로킹하지 않도록 별도 쓰레드에서 DB에 반영하도록 할 것이다. 사용자가 좋아요를 마구마구 바꾸기도 한다. 만약 좋아요 상태가 바뀔 때 마다 스레드를 생성(new instance and start)하거나 스레드가 스레드(get instance and star..

android targetsdkversion & minsdkversion

targetSdkVersion? minSdkVersion? maxSdkVersion?안드로이드에서 애플리케이션을 개발할 때 가장 기본적으로 설정해야 하는 manifest의 설정 인 uses-sdk에 대해 적어보고자 한다. 각각의 요소들의 값이 어떤 역할을 하는지 모르고 무작정 올리거나 내리는 경우가 많다.각 요소의 값에 따라 구동이 되는 단말의 개수가 현저하게 달라지므로, 이 요소들에 대해 자세히 알아보자. 구문123cs 포함된 위치 : android:minSdkVersion애플리케이션이 필요한 최소 API레벨을 지정하는 정수. Android 시스템이 시스템의 api레벨이 이 특성에 지정된 값보다 더 낮은 경우 사용자가 애플리케이션을 설치하는 것을 방지한다.(필수값) Example) 구분 애플리케이션 m..

마리아 DB 오류 org/mariadb/jdbc/Driver : Unsupported major.minor version 52.0

Spring이나 혹은 기타 JAVA 프레임워크에서 mariadb를 사용할 때가 있다. mariadb를 gradle이나 maven으로부터 dependency를 걸어서 사용하고 실행시키면 아래와 같은 메시지가 나올 때가 있다. org/mariadb/jdbc/Driver : Unsupported major.minor version 52.0 위 메시지가 나오는 이유는 mariaDB connector가 버젼에 따라서 JAVA version 지원정도의 차이가 있기 때문이다. 위 메시지는 아래와 같은 build.gradle에서 문제가 생긴것을 확인하였다. build.gradle123456789101112131415161718192021apply plugin: 'java'apply plugin: 'eclipse'app..

해외 IT 교육 사이트 소개 Team treehouse

https://teamtreehouse.com/Introduce team treehouseAbout team treehouse스크린샷. 트리하우스 홈페이지 Treehouse brings affordable technology education to people everywhere in order to help them achieve their dreams and change the world. Treehouse believes in the democratization of technical education. There are currently too many barriers, economical and psychological. 팀 트리하우스는 해외 IT 교육사이트이다. 인터넷기반으로 여러가지 IT테크..

개발이야기 2017.07.09
Install Mysql for spring project(in Macbook)

Spring 프로젝트를 하면서 DB연결은 필수적이다. DB는 무었을 쓸까 고민하던 도중 Oracle을 사용하려고 했지만 Mac에서 local로 돌리기 적합하지 않다는 생각에 MySQL을 깔기로 결정하였다. MySQL(위키피디아)은 다음과 같은 특징을 가진다.오픈소스의 관계형 데이터베이스 관리 시스템(RDBMS)다중 스레드, 다중 사용자 형식의 구조 질의어 형식의 데이터베이스 관리 시스템GPL 라이선스다수의 프로그래밍 언어로 된 API 사용가능Install MySQLMySQL을 쉽고 빠르게 개발하기 위해서 나는 HomeBrew(공식 웹사이트)를 사용하기로 결심했다.HomeBrew는 MacOS 용 패키지 관리자로서 한번의 설치로 다양한패키지를 단 한줄로 설치 할 수 있다. HomeBrew 설치하기1/usr/..

Spring boot application.properties 설명

스프링 프레임 워크는 자바앤터프라이즈 애플리케이션을 구동하기 위한 취적의 프레임 워크이다. 한국 정부에서는 애초에 전자정부의 프레임 워크를 이 스프링 프레임워크를 채용하여 사용하고 있으며 많은 대기업들이 거대한 서비스를 제공하기 위해서 스프링 프레임 워크를 사용하고 있다. 스프링 프레임 워크는 스프링 부트, JPA, 배치 등 여러가지 편리하고 유용한 서비스들을 만들수 있도록 도와준다. 그 중 스프링 부트(Spring boot)는 스프링 프레임워크를 빠르게 개발할 수 있도록 도와주는 유용한 기능이다. 이전에 스프링에서 사용하고, 써야 했던 xml파일들을 간단히 java파일에서 annotation으로 선언만 하면 자동으로 bean 등이 등록이 되어 이해하기도 쉽고 개발도 한결 쉬워진다. Spring-Boot..

기본적인 UX에서 취해야할 점

평소에 UI UX에 관심이 있던지라 UX관련 책을 지인에게 소개 시켜달라고 했더니 콘텐츠UX디자인 이라는 서적을 추천받았다. 디자인하시는 분들에게는 교과서라고 불린다고 해서 호기심에 구입하고 읽어보았다. 이 책은 90년대 2000년대 초반의 닷컴 붐에 따른 난잡한 디자인으로 망가진 웹사이트들을 예시로 들며 이야기하고 있는데, 모바일 퍼스트인 지금의 유행과는 다소 방향이 다르다고 볼 수 있다. 모바일은 PC웹화면과는 다르게 해상도가 작고 다양한 인터페이스를 활용할 수 있다. 그러나 기본적인 사용자의 특성이나 콘텐츠를 인지하는 방향은 현재와 같으므로 이를 기초로 습득, 변형하여 활용이 가능할 것으로 보인다. 개발자인 나로서는 디자이너보다 UI/UX적인 지식이 떨어질 수도 있고, 바라보는 방향이 다를 수도 있..

[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]자료형을 정의할 때 표식 인터페이스를 사용하라

마커 인터페이스 혹은 표식 인터페이스(marker interface)는 아무 메서드도 선언하지 않는 인터페이스이다.(자세한 내용 참조 블로그) (Ex. Cloneable, serializable,Eventlistener,Remote,RandomAccess,EnterpriseBean 등) 표식 어노테이션 vs 표식 인터페이스표식 인터페이스는 표식이 붙은 클래스가 만드는 객체들이 구현하는 자료형이라는점, 표식 어노테이션은 자료형이 아니다.표식 인터페이스는 적용 범위를 좀더 세밀하게 지정할 수 있기 때문에 표식 어노테이션보다 낫다. 그럼 어떤 상황에서 표식 어노테이션과 표식 인터페이스를 선택해서 사용해야 하나?클래스나 인터페이스 이외의 프로그램 요소에 적용되어야 하는 표식은 어노테이션으로 만들어야 한다.표식을..

[Effective Java]Override 어노테이션은 일관되게 사용하라

어노테이션을 일관되게 사용하면 끔찍한 human error로 인한 버그들을 방지 할 수 있다. 123456789101112131415161718192021222324252627public class Bigram { private final char first; private final char second; public Bigram(char first, char second){ this.first = first; this.second = second; } public boolean equals(Bigram b){ return b.first == first && b.second == second; } public int hashCode(){ return 31 * first + second; } public..

[Effective Java]작명 패턴 대신 어노테이션을 사용하라

Java 1.5 이전에는 annotation이 존재하지 않았다. 그래서 이전에는 도구 or 프레임워크를 특별 취급하기 위해서 Java 1.5 이전에는 작명 패턴을 사용(ex. JUnit 테스트 이름을 test로 시작하는 것)했다. 그러나 이 방법을 사용하면 이름을 잘못 입력하면 문제가 발생하거나 무시해버리는 오류가 생기며, parameter을 전달할 방법이 없었음. 이를 해결하기 위해 Java 1.5에서는 annotation이 등장 했다.JAVA API Annotation 자료형 보러가기(클릭) Annotation 종류@Override - 해당 메소드가 부모 클래스에 있는 메소드를 오버라이드 했다는 것을 명시적으로 선언@Deprecated - 더이상 사용되지 않은 클래스나 메소드 앞에 추가@Suppres..

[Effective Java]int 상수 대신 enum을 사용하라

JAVA API Enum 자료형 보러가기(클릭) Java enum의 특징 1. enum은 가독성이 좋고 안전하며 강력함2. enum안에 데이터 또는 그 데이터에 관계된 메서드를 추가해 기능을 향상시킨 enum으로 만들 수 있음 3. C/C++/C# 언어의 enum(단순 int 값)과는 다르게 Java에서는 참조 자료형으로 사용한4. toString 메서드를 호출하여 문자열로 쉽게 변경 가능5. Object 메서드 사용가능6. Comparable, Serializable 인터페이스가 구현되어 있음 End of Document

[Effective Java]예외를 무시하지 마라

어떤 메서드에 대해 예외가 발생할 수 있다고 선언했다면, 그것은 API를 이용할 프로그래머에게 무언가를 알리려는 것이다. 무시하면 안된다. 아래와 같은 코드로 손쉽게 무시 할 수도 있다. 위와 같은 코드처럼 무시할 수도 있지만 매우 의심스럽고 가독성도 떨어지고 이유를 알기가 어렵다. catch블록안에 적절한 코드가 없다면 적어도 catch 블록 안에는 예외를 무시해도 괜찮은 이유라도 주석으로 남겨두기라도 해야만 한다. End of Document.

[Effective Java]실패 원자성 달성을 위해 노력하라

예외를 던지고 난 뒤에도 객체는 상태가 이전 상태와 동일하며 사용가능한 형태로 남아있어야 한다. 특히 checked exception의 경우 그렇다. 위와 같은 코드 처럼 빈 스택에서 뭔가 뽑아내려고 할때 먼저 상황을 체크하고 exception을 throw하여 실패 원자성(failure atomicity)을 갖춘 코드라 볼수 있다. 방법은 크게 두가지가 있다. 1. exception이 났을 때 roll back될수 있도록 코드를 구성한다.2. 실패할 가능성이 있는 코드를 전부 객체 상태를 바꾸는 코드앞에 배치한다. 이러한 실패 원자성은 권장하지만 가은 객체를 여러 스레드가 동기화 없이 접근하는 것과 같은 특수한 경우에는 객체 상태의 일관성이 깨질 가능성이 있다. 또한 실패 원자성을 달성하기 위해 코드의 ..

[Effective Java]어떤 오류인지를 드러내는 정보를 상세한 메시지에 담으라

런타임에서 catch하는 unchecked exception에서 프로그램이 죽으면 시스템은 자동으로 해당 예외의 스택 추적 정보(stack trace)를 출력한다. 스택 추적정보는 예외 객체의 클래스명 뒤에 상세 메시지가 오는 형태로 구성되어 있다. 그러므로 오류 정보를 쉽고 빠르게 포착해 내기 위해서는, 오류의 상세메시지에 "예외에 관계된" 모든 인자와 필드의 값을 포함시켜서 stack trace에서 볼 수 있도록 한다. 위와 같은 상세 메시지를 사용하게 되면 최종 사용자(프로그래머, 서비스 담당자)가 오류 원인을 분석하여 이해 할 수 있게 된다. 최종 사용자가 오류 원인을 분석하기 위해서는 가독성보다 내용이 훨씬 중요하기 때문일 것이다. End of Document

[Effective Java]메서드에서 던져지는 모든 예외에 대해 문서를 남겨라

메서드를 올바르게 사용하려면, 메서드에서 던져지는 예외에 대한 설명이 문서에 있어야 한다. 따라서 문서화는 아주 중요하다.(당연한 이야기) 1. Javadoc @throws 태그를 사용해서 정확하게 밝히기2. 같은 이유로 동일한 예외를 던지는 메서드가 많으면 메서드마다 문서를 만들지말고, 예외에 대한 문서를 클래스의 문서화 주석(documentation comment)에 남기자. 단순하지만 명확한 결론 결론 : 메서드가 던질 가능성이 있는 모든 예외를 문서로 남기자

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

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

[Effective Java]불필요한 점검지정 예외 사용은 피하라

자바에는 exception이라는 훌륭한 기능을 제공한다. 그중 두가지 exception 종류는 아래와 같은 표로 정리 할 수 있다. checked exception unchecked exception 처리여부 반드시 처리 명시적으로 처리 안해도 됨 확인시점 컴파일 런타임 대표예외 exception의 상속받는 하위 클래스 중 Runtime exception을 제외한 모든 예외 runtime exception 하위 예외 이 중 checked exception을 너무 많이 남발하게 되면 불편하므로 checked exception을 던지지 않는 소스로 리펙토링 하는 것도 좋은 방법이다. 위와 같이 file input output 소스가 있다고 한다면 아래와 같이도 바꿀 수 있을 것이다. 항상 이렇게 리펙토링 가..

[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)을 활용하여 객체를 생성했으나 이는 어떤 파라미터..