전체 글
JAVA 병렬 프로그래밍 [1]
프로그램을 제대로 돌아가게 작성하는 일은 정말 어렵다. 하지만 여러 작업을 동시에 실행하는 프로그램을 제대로 돌아가게 작성하기는 훨씬 더 어렵다. 그럼에도 불구하고 왜 작업을 동시에 실행하는 문제에 신경을 써야할까? 스레드는 자바 언어에서 피할 수 없는 특성이고, 복잡한 비동기 코드를 더 단순한 순차적 코드로 바꿔 복잡한 시스템을 단순하게 개발할 수 있게 해주기 때문이다. 초창기 컴퓨터에는 운영체제 자체가 없었다. 운영체제 없이 하드웨어 위에서 바로 실행되는 프로그램은 작성하기도 힘들었을 뿐만 아니라 한 번에 하나의 프로그램만 실행하느라 그 값비싸던 자원을 비효율적으로 사용 할 수 밖에 없었다. 영화 이미테이션 게임에 나오는 튜링머신과 같이, 배선이나 진공관을 직접 계산시마다 바꿔줘야 했기 때문에 다수의..
[JAVA] SOLID 객체지향 설계 5원칙
이번 포스팅에선 객체지향 설계 5원칙인 SOLID에 대해 알아보려고 한다. 객체지향의 4가지 특성인 캡슐화, 추상화, 다향성, 상속과 더불어 설계 원칙을 공부해보자. SOLID 는 자기 자신 클래스의 응집도는 내부적으로 높이고 , 타 클래스들간 결합도는 낮추는 High Cohesion - Loose Coupling 원칙을 객체 지향의 관점에서 도입한 것 이다. 정보처리자격증을 공부할 때, 응집도가 높고 결합도가 낮을 수록 객체지향의 설계에 적합하고, 이렇게 설계된 SW는 재사용성이 증가하고, 수정이 최소화 되기 때문에 유지보수가 용이해진다고 배웠다. SRP ( Single Responsibility Principle ) 단일 책임 원칙 " 어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 한다" 클..
[JAVA] Static과 Final
Static이란? java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다. 일반적으로 우리가 만든 Class는 Static 영역에 생성되고 , new 연산을 통해 생성한 객체는 Heap 영역에 생성된다. 객체 생성 시 할당된 힙은 가비지 컬렉터를 통해 수시로 관리를 받는다. 하지만 Static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리가 되고, 가비지컬렉터의 관리 영역 밖에 존재하므로 프로그램 종료시 까지 메모리가 할당된 상태로 존재한다. 때문에 자주 사용하게 되는 static은 성능에 도움을 줄 수 있지만 자주 사용하지 않는 프로그램이나 static을 무분별하게 사용한다면 성능에 악영향을 주게 된다. 전에..
[JAVA] 스택과 힙 , 가비지 컬렉터
자바에서 일반적으로 구성되는 메모리의 구조는 다음과 같이 Stack 과 Heap 메모리로 구성된다. Stack 스택 메모리는 heap 영역에 존재하는 객체들에 대한 참조를 가지고 있다. 또한 객체들 뿐만 아니라 기본형 타입 , main() 함수를 포함한 각 함수의 지역변수도 Stack 메모리 영역에 저장된다. Stack에 존재하는 변수들은 유효범위(scope)라고 하는 특정한 가시성을 가진다. 오직 활성화 된 범위의 객체들만 사용이 가능하다. scope란 무엇일까? 유효범위는 쉽게 말하면 명명충돌을 방지하는 기능이라고 생각하면 되겠다. public class DemoScope { static void a () { int i = 0; } public static void main(String[] args)..
[JAVA] String에서 ==와 equals()의 차이점
전에 작성한 포스팅 중, null과 inEmpty의 차이점에 대해 작성했던 적이 있었다. isEmpty와 ==null - 객체가 비어있는지 확인하는 방법 — 간편 웹프로그래밍 (tistory.com) isEmpty와 ==null - 객체가 비어있는지 확인하는 방법 객체가 비어있는지 확인할 때에는 'isEmpty'와 '==null'을 사용한다. 두가지의 차이점은 isEmpty()는 객체가 값이 존재하지 않으면 true를 리턴한다 ex ) String a =""; 이면 true 객체에 ""라는 값(a)이 들어가 kimfk567.tistory.com 이번엔 ==과 equals()에 대해 포스팅해보려고 한다. 일단 null은 메모리영역이 아예 비워있을 때 true이고, isEmpty는 객체가 비어있을 때 tru..
카카오로그인과 OAuth2
이번에 소셜로그인을 진행하면서 , 그간 한두번 해봤던 소셜로그인을 다시 해보았다. 항상 구글검색으로 나온 코드를 맞는지 틀리는지도 모르고, 대충 복붙하여 오류범벅으로 사용하곤 했는데, API를 여러번 사용하며 Http로 데이터를 주고 받는 것에 익숙해지니, 정말로 쉽게 느껴졌다. 소셜로그인 제공업체의 API명세를 보며 직접 코드를 짜다보니, 예전에 복붙하던 코드에는 내 프로젝트엔 필요없는, 쓸데없는 게 많았구나 하고 느끼기도 했고, 이렇게 간단한게 왜 그 당시에는 그렇게 어려웠을까... 하고 생각이 났다. 물론 아직도 한참 부족하지만, 전보다는 성장함을 느끼게 해준 부분이라 참 뿌듯했다. 일단, OAuth란 무엇일까? 각자의 경험으로 생각해봐도 소셜로그인, 즉 카카오나 네이버, 구글로그인 등이 웹에서 보..
HttpURLConnection을 이용한 API 데이터 받아오기
이번 프로젝트에 OPEN API에서 GET방식으로 파라미터를 전달하고, 데이터를 가져와야 하는 부분이 있었다. js를 사용한 프론트단에선 ajax로 컨트롤러를 호출하듯이 쉽게 값을 가져올 수 있었지만, 백단에선 조금 다르게 호출한 다음 String값으로 오는 데이터를 처리해줘야 한다. Http를 연결을 사용하기위해 필요한 것이 HttpURLConnection이다. HttpURLConnection은 ? URL 내용을 읽어오거나 , URL에 GET,POST 방식으로 데이터를 전달할 때 사용한다. 웹페이지나 서블릿에 데이터를 전달 할 수 있다. URL url = new URL(https://api주소?파라미터1=111&파라미터2=222); ObjectMapper mapper = new ObjectMapper(..
[스프링부트] 에디터 이미지업로드 시 임시폴더로 분리하기
기존 CK에디터를 이용해서 이미지를 업로드 할 때는 js script 에디터부분에서 컨트롤러 호출 - multipart로 가져온 파일명을 중복되지않게 난수값을 포함해서 저장 - 로컬의 특정위치에 바꾼파일명으로 파일을 저장 - 파일경로를 표시하는 특정문자열을 붙여서 에디터로 리턴 - 에디터에서 로 이미지 출력 의 로직으로 이미지를 업로드 했다. 여기서 문제점은 일단 글을 작성하든 안하든 에디터로 이미지를 업로드 하는 순간, 사용자가 이미지를 보기 위해선 일단 로컬에 업로드를 시켜야 한다는 것이다. 지금까지는 사용자가 있는 웹을 생각하지 않았기 때문에, 그냥 하나의 폴더를 이용해서 이미지 업로드를 구현했지만 사용자가 다수 있을 때 이런식으로 구현하는건 꽤나 큰 서버 저장공간의 낭비를 만들 것 같아서 저장되는..
JS 타이머 함수
JS 내장함수인 타이머 함수이다. setTimeout(함수, 시간) 일정 시간 후 함수 실행 setInterval(함수, 시간) 일정 시간 간격으로 함수 반복 실행 clearTimeout(id) 실행되고 있는 timeout 을 중지 clearInterval(id) 실행되고 있는 interval 을 중지 EX) function hello() { alert('hello'); } //hello 함수를 1초뒤 한번만 실행 setTimeout(hello, 1000); //hello 함수를 1초마다 실행 setInterval(hello, 1000); 주의! 함수를 넣을때 hello() 가 아닌 함수명만을 넣어줘야 한다.
스프링부트 Scheduler
Scheduler 설정한 시간마다 특정한 동작을하는 스케쥴러를 활용해보았다. 현재 프로젝트중인 구인게시판이다. 카풀, 동호회, 같이타요 등 스키장과 관련된 구인을 할 수 있는 게시판인데, 글작성 중 제공일자를 선택할 수 있다. 제공일자를 경과하거나 마감버튼을 따로 누르면 마감글포함 버튼을 누르지 않으면 표시되지않고, 파란색으로 따로 표시되고 연락처칸이 블라인드처리 된다. 마감이 됐는지 안됐는지 따로 컬럼을 만들어서, 구분자를 만들어 분류를 해줬다. 일일이 게시글을 확인해 마감처리를 해줄수는 없으니 스케쥴러를 사용해서 매일오전 0시에 제공일자를 경과한 게시글은 자동적으로 마감처리를 해줘야겠다. import org.springframework.beans.factory.annotation.Autowired; ..