목록DEV&OPS/Java (152)
삶 가운데 남긴 기록 AACII.TISTORY.COM
관점 지향(Aspect Oriented Programming) 로깅 보안/인증 트랜잭션 리소스 풀링 에러 검사 / 처리 정책 멀티 스레드 안전 관리 데이터 영속처리 위 항목들은 소프트웨어 개발 시 발생하는 공통적인 문제들입니다. 핵심 관심(core concern)은 업무 로직을 말합니다. 횡단 관심(cross-cutting concern)은 위에서 언급한 로깅이나 보안등 공통 시스템 로직을 말합니다. 이처럼 업무 기능과 시스템 기능간에 결합성을 제거하도록 분리하여 작성하는 방법을 관점 지향이라고 합니다. 관점 지향 용어 advice : 관점이 언제, 무엇을 하는지를 정의 joinpoint : 관점이 실행될 수 있는 위치들 pointcut : joinpoint 중에서 advice 하는 위치(어디서) asp..
Spring bean을 XML로 관리 할 수 있지만, bean객체가 많아지면 XML 설정도 많아져 불편해집니다. 그래서 나온 방법이 auto wiring(bean 연결) 과 annotation wiring(bean 연결) 입니다. annotation wiring 어노테이션 와이어링을 사용하기 위해서는 context를 관리하는 XML 설정 파일에 context 네임스페이스를 추가해야 합니다. 이렇게 패키지 이름을 component-scan 으로 지정해주면 Spring이 자동으로 bean을 스캔해서 발견해줍니다. @Autowired Spring의 기본 의존성 주입을 위한 어노테이션입니다. 필드, 생성자, setter 메서드에 사용할 수 있습니다. 타입 와이어링을 시도 한 후 실패하면 이름 와이어링으로 후보 ..
페이징 처리시 게시물 10개를 기준으로 10페이지씩 표기하는 방법을 기준으로 개발하는 것이 보통입니다. endPage endPage = (int)(Math.ceil(cri.getPage() / (double)displayPageNum) * displayPageNum); cri.getPage()는 현재 페이지 번호를 의미합니다. displayPageNum은 화면 하단에 페이징 버튼의 갯수를 의미합니다. 현재 페이지가 3일 때 : Math.ceil(3/10)*10 = 10 즉, endPage는 10입니다. 현재 페이지가 20일 때 : Math.ceil(20/10)*10 = 20 즉, endPage는 20입니다. 현재 페이지가 21일 때 : Math.ceil(21/10)*10 = 30 즉, endPage는 3..
Spring bean 스프링 프레임워크가 관리하는 클래스들의 인스턴스 객체들을 Spring bean 이라고 합니다. Spring bean 설정 방법 XML로 설정 할 때에는 아래 처럼 설정합니다. 어노테이션을 이용해서 설정할 때에는 아래처럼 클래스 위에 @Configuration 어노테이션을 설정하고, 메서드 위에는 @Bean 어노테이션을 설정해 줍니다. 패키지 경로는 net.aacii.app 으로 가정합니다. import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import net.aacii.app.service.SampleService; import ne..
java.lang.ClassNotFoundException: sun.misc.GC 이클립스에서 톰캣을 실행할 때 가끔 볼 수 있는 이 오류는 톰켓 버전과 JDK 버전이 맞지 않을 때 발생하는 오류입니다. 예를 들어 Tomcat 8을 사용중일 때 JDK가 11이 설치되었을 때 발생할 수 있습니다. sun.misc.GC는 java9부터 제외되었기 때문입니다. PC에 JDK8과 JDK11이 둘 다 설치되어 있다는 가정하에 이클립스에서 JDK 버전을 바꿔주는 방법으로 해결합니다. 이클립스 > Window > Preferences > Java > Installed JREs 위 화면에서 우측 Search... 버튼을 눌러 JDK8이 설치된 경로를 찾은 후에 설정을 체크하면 오류가 해결됩니다. 만약 프로젝트가 다양해..
1. 이클립스 > Window > Preferences 2. Java > Code Style > Code Templates 에서 Comments 항목을 펼치면 여러가지 항목이 나오는데 그 중에서 Types: 클래스 상단에 적용되는 주석 Methods: 메서드에 적용되는 주석 위 항목들을 클릭하고 Edit 버튼을 눌러 자주 사용하는 2개만 수정해 봅시다. Types 예제 /** * @author : ${user} * @date : ${date} * @description : */ Methods 예제 /** * @author : ${user} * @date : ${id:date('YYYY-MM-dd')} * @description : * ${tags} */ 위처럼 Edit 한 후 apply를 눌러 적용합니다..
Bcrypt 사용 예 maven이나 gradle로 관련 라이브러리를 추가 후 아래와 같이 사용합니다. String pw = "pw1234!"; //실제 데이터베이스에 저장될 패스워드의 해시값 String hashed = BCrypt.hashpw(pw, BCrypt.gensalt()); //입력된 패스워드와 해시되어 저장된 패스워드를 비교 boolean isValid = BCrypt.checkpw(pw, hashed); salt 해시된 패스워드를 저장한 테이블인 Rainbow Table 을 이용한 해킹 공격을 막기 위하여 랜덤 생성한 salt값을 더한 뒤 다시한 번 해시 값을 얻어서 Rainbow Table 을 이용한 공격을 막습니다. Bcrypt 해시 값의 예 $2a$10$vI8aWBnW3fID.ZQ4/..
JAVA application Export runnable jar 자바 어플리케이션을 실행가능한 jar 파일로 만들 때 manifest 파일(MANIFEST.MF)에 메인 클래스를 지정해줘야 합니다. https://iloveaired.tistory.com/entry/Jar-manifest-%ED%8C%8C%EC%9D%BC-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0 Jar manifest 파일 등록하기 예) Manifest-Version: 1.0 Main-Class: XXXXX iloveaired.tistory.com https://m.blog.naver.com/eungsik80/220054805497 jar 파일 생성 시 MANIFEST.MF 작성 jar 파일 생성 시 MANIFE..
1. 인코딩(Encoding) 1.1. 파일 및 문자 인코딩은 UTF-8 (gerneral_ci)으로 통일한다. 2. 이름(Naming) 2.1. 변수명, 클래스명, 인터페이스명, 메서드명에는 영어와 숫자만 사용한다. public interface AutoClosable{ 2.2. 변수명, 클래스명, 인터페이스명, 메서드명 단어 합성시에는 낙타 등 표기법으로 한다. public interface RowMapper{ 2.3. 클래스명, 인터페이스명, 생성자명은 대문자로 시작한다. public class WatcherClass{ 2.4. 변수명과 메서드명은 소문자로 시작해야한다. public String setHtmlName(String mode){ 2.5. 상수명은 모두 대문자로 하고 단어를 합성할 때는 ..
java.util.concurrent.TimeUnit 패키지 TimeUnit은 멀티 Thread가 아닌 메서드에서 시간을 지연 시킬 때 사용합니다. 예제 import java.util.concurrent.TimeUnit; public class SimpleTest { public static void main(String[] args) { try { for (int i = 0; i < 3; i++) { TimeUnit.SECONDS.sleep(2); System.out.println("Sleep "+i+" sec"); } }catch(Exception e) { System.out.println(e); } } } 자세한 api 문서는 아래 참고 https://docs.oracle.com/javase/7/d..
서비스(비즈니스 로직) 서비스 레이어는 controller와 persistence 사이에서 비즈니스 로직을 수행하는 역할입니다. service 패키지를 만들어 아래 예제를 작성합니다. package ds.co.kr.todo.service; import org.springframework.stereotype.Service; @Service public class TodoService { public String testService() { return "Test Service"; } } @Service 어노테이션은 비즈니스 로직을 수행하는 컴포넌트이며 서비스 레이어임을 알려주는 어노테이션입니다. 스테레오 타입 어노테이션으로 내부에 @Component를 포함하고 있습니다. @RestController 에도 ..
REST 제약 조건 Client - Server 구조를 따릅니다. stateless 클라이언트가 서버에 요청을 보낼 때 이전 요청의 영향을 받지 않습니다. 그래서 요청을 보낼 때 로그인(인증) 정보를 항상 함께 보내야 합니다. http는 기본적으로 staeless 구조입니다. Cacheable 캐시가 가능한지 명시할 수 있어야 합니다. http는 헤더에 cache-control 에서 캐시 여부를 명시할 수 있습니다. Uniform Interface 리소스를 URI를 통한 인터페이스로 관리합니다. Layered System 인증서버, 캐싱 서버, 로드 밸런서 등 여러 레이어로 된 서버들을 거치지만 클라이언트는 서버 사이의 레이어의 존재 유무를 알지 못합니다. Code on demand 클라이언트는 서버에 ..
아키텍처 Request → Controller(프레젠테이션 레이어, DTO) → Service(비즈니스 레이어, Model) → Persistence(퍼시스턴스 레이어, Entity) → DB(데이터베이스 레이어) → Persistence(entity) → Service(model) → Controller (DTO)→ Response Model, Entity 비지니스 데이터를 담는 역할을 Model이라 부르고 데이터베이스의 테이블의 스키마를 표현하는 역할을 Entity라고 합니다. 아키텍처의 각 레이어 별로 부르는 이름이 다를 뿐, 이름은 신경 쓰실 필요는 없습니다. Lombok 어노테이션 @Builder 디자인 패턴 중에서 빌더 패턴으로 구현하여 객체를 생성해줍니다. 생성자로 생성하는 것과 차이가 있다..
Gradle 빌드 도구 빌드 도구는 컴파일, 라이브러리 다운로드, 패키징, 테스팅 등을 자동화 해주는 도구를 말합니다. 프로젝트가 커지면 라이브러리가 많아지므로 전체를 빌드하기에는 비효율 적이므로 빌드를 나눠서 해야합니다. gradle은 이런 컴파일, 빌드, 유닛 테스트 등을 코드(그루비 언어)로 관리해줍니다. build.gradle plugins { id 'org.springframework.boot' version '2.6.12-SNAPSHOT' id 'io.spring.dependency-management' version '1.0.13.RELEASE' id 'java' } group = 'ds.co.kr' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1..
스프링 부트(Spring boot) 기존 스프링 프레임워크는 세팅이 매우 복잡하기 때문에 세팅을 자동으로 해주는 스프링 부트가 등장했습니다. 스프링 부트 덕분에 Stand-alone 어플리케이션을 쉽게 구동가능해졌습니다. 기존에는 자바 웹 어플리케이션을 WAR 파일로 압축해서 WAS에 배포했었고 다수의 WAR 파일을 동시 구동할 수 있어서 stand-alone이 아닙니다. 스프링 부트는 내장된 임베디드 WAS(tomcat, jetty 등)로 구동하게 됩니다. IDE 는 전자정부프레임워크 4.0 이상이나 STS 에서 스프링 부트를 지원합니다. DispatcherServlet 기존 웹 어플리케이션 개발은 HttpServlet을 상속하는 클래스를 만들고 doGet()이나 doPost()메서드를 구현하고 Htt..
