본문 바로가기

Programming/JAVA

(22)
[Java10] Var 키워드의 사용 (타입 추론) > 복기 목적으로 개인 학습 내용을 정리한 글로 굉장히 가독성이 떨어질 가능성과 문맥이 매끄럽지 않을 가능성이 높습니다. java 10부터 지역 변수 선언시 변수의 타입 대신 var 키워드 사용 가능 기존 전형적인 변수 선언 예시와 비교해보겠음 변수 타입 변수명 = 초기값; 위와 같이 선언하였으나, java 10 부터는 var 키워드를 사용하여 특정 데이터 타입에만 의존하지 않고 타입 추론이 가능함. 아래와 같이 말임. java 8로 업무를 보는 나의 입장에서 먼저 들었던 생각은 오잉. 유지보수하고 운영하는 입장에서는 변수가 어떤 데이터 타입을 가지는지 명확하게 아는게 좋지 않나? 라고 먼저 생각이 들었으나, 활용 범위와 특징을 좀 더 공부한 뒤 생각이 바뀌었음. var을 타입으로 사용할 경우 지역 변수..
[Java Secure coding] 자바 시큐어코딩 기법 (2) - SQL Injection SQL Injection - SQL 삽입 공격 - 보안상 취약점을 이용해 악의적으로 임의의 SQL문을 삽입해 DB가 비정상적인 동작을 하도록 하는 것 - SQL 인젝션 공격에 의해 DB가 노출된 사례가 존재함 - 사용자 입력 값에 필터링이 제대로 적용되어 있지 않은 취약점을 악용한 공격기법임 입력 데이터 검증 및 표현 - 공격자가 쿼리를 조작할 수 있는 문자열을 입력해 인가되지 않은 사용자가 DB 데이터를 무단으로 조회 또는 삭제할 수 있음 - preparedStatement가 아닌 statement로 쿼리에 아래와 같이 입력되어 있는 경우 "SELECT * FROM USER WHERE id = '" + userVO.getUserId( ) + "' and pw = '" + userVO.getUserPw(..
[Java secure coding] 자바 시큐어코딩 기법 (1) Secure coding 사용자가 입력한 데이터는 신뢰할 수 없음을 전제로 개발에 착수해야 함 - 보안을 강화하기 위한 코딩이라고 보면 됨 - 웹 애플리케이션에 취약한 부분을 보완하고 강화하기 위함 - 운영과 유지보수에서도 굉장히 중요한 내용으로 판단됨 --> 행정자치부 한국인터넷진흥원(KISA)에서 발표한 SW 보안 가이드에 따라 7가지 분류가 존재함 한국 인터넷진흥원 기술 안내서 가이드 https://iamfreeman.tistory.com/entry/한국인터넷진흥원KISA-기술안내서-가이드 2020 자바 시큐어코딩 기준 https://www.kisa.or.kr/public/laws/laws3_View.jsp?cPage=6&mode=view&p_No=259&b_No=259&d_No=55&ST=T&SV..
[Effective JAVA 3SE] item 37: ordinal 인덱싱 대신 EnumMap을 사용하라 ordinal 메서드(아이템 35) 배열 혹은 리스트에서 원소를 꺼내기 위해 이를 사용해 인덱스를 얻는 경우가 있음 ordinal 메서드는 인스턴스가 가진 EnumName의 Index 번호를 넘겨줌 코드 37-1의 문제 겸, ordinal 메서드 사용의 문제 배열과 제네릭은 호환되지 않기에 비검사 형변환 수행을 해야 하며, 이로 깔끔히 컴파일되지 않을 것임 배열은 숫자로 된 데이터로 인덱스의 의미를 모르니 출력 겨로가에 레이블을 달아야 함 정숫값을 사용한다는 것을 직접 보증해야 함 정수는 열거 타입과 달리 안전하지 않음 잘못된 값을 사용할 경우 그대로 잘못된 수행을 하거나 (ㅋㅋㅋ 최악의 상황 ㅠ) 운이 좋을 경우 ArrayIndexOutOfBoundsException을 던짐 위 문제 해결 :: Enum..
[Effective JAVA 3SE] item 36: 비트 필드 대신 EnumSet을 사용하라 비트 필드 열거 값들이 단독이 아닌 집합으로 사용될 경우 정수 열거 패턴(아이템 34)를 사용함 (223 페이지 코드 36-1) 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있음 이로 만들어진 집합을 비트 필드(bit filed)라고 함 비트 필드의 사용 비트별 연산으로 합집합과 교집합 같은 집합 연산의 효율적 수행 가능 하지만.. 비트 필드의 문제를 안고 있음 비트 필드 값이 그대로 출력될 경우 단순 정수 열거 상수 추력시보다 해석하기 훨씬 어려움 모든 원소를 순회하기 까다로움 최대 몇 비트가 필요한지 API 작성 시 미리 예측해 선택해야 함 (API를 수정하지 않고 비트 수를 더 늘릴 수 없기 때문) 현재 비트 필드보다 더 나은 대안이 존재함 EnumSet Class 장점 java.ut..
[Effective JAVA 3SE] item 28: 배열보다는 리스트를 사용하라 서론 배열과 제네릭 타입에 두 가지의 중요한 차이가 존재함. 1 . 공변(convariant)여부 >> 배열은 공변임 - Sub(자식)이 Super(부모)의 하위 타입이라면 배열 Sub[ ]는 배열 Super[ ]의 하위 타입이라는 뜻 - 공변은 한자 풀이 그대로 함께 변화한다는 뜻임 >> 제네릭은 불공변임 - 서로 다른 타입 Type 1과 Type 2가 존재할 때, List은 List의 하위 타입도 아니고 상위 타입도 아님 서로간의 상위 하위 타입 문제로 접근하자면 제네릭이 더욱 문제있어 보일 수 있지만, 문제가 있는 쪽은 배열임 공변이 왜 문제가되는지 예시 코드를 살펴보겠음. 2. 실체화(Reify) 여부 >> 배열 실체화 가능 - 배열은 런타임에서 자신이 담기로 한 원소의 타입인지 확인함 - 그래서..
[Effective JAVA] item 22 : 인터페이스는 타입을 정의하는 용도로만 사용하라 서론 인터페이스 자기 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입의 역할을 함 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에게 이야기하는 것 인터페이스는 그렇기에 '타입을 정의하는 용도'로만 사용되어야 함 상수 인터페이스 안티 패턴 : 사용 금지! 상수 인터페이스 : 메서드 없이 static final 필드로만 이루어진 인터페이스 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아닌 내부 구현에 해당됨 고로 상수 인터페이스를 구현하는 것은 내부 구현 클래스의 API로 노출하는 행동임 상수를 공개할 목적일 경우 특정 클래스나 인터페이스와 강하게 연관된 상수일 경우 그 클래스나 인터페이스 자체에 추가해야함 예시. Integer와 Double에 선언..
[Effective JAVA] item 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라 서론 인터페이스에 메서드 추가하면 보통 컴파일 오류가 발생함 왜냐면 추가된 메서드가 기존 인터페이스에 존재할 가능성이 굉장히 낮기 때문 디폴트 메서드(Default Method) 인터페이스의 디폴트 메서드를 재정의 하지 않은 모든 구현 클래스에서는 디폴트 구현이 사용됨 기존 인터페이스에 메서드를 추가하는 것은 어려운 일은 아니나, 기존 구현체들과 모든게 매끄럽게 연동된다는 보장은 없음 (자바 7까지는 현 인터페이스에 새로운 메서드가 추가될 일은 영원히 없다는 가정 하에 작성되었기 때문임) 자바 8에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가됨 이는 람다를 활용하기 위해서임 대부분의 자바 라이브러리에 디폴트 메서드는 코드 품질이 높고 범용적이라 대부분 상황에서 잘 작동하나, 생각할 수 있는..