발단 모델을 수정하고 Alembic의 revision을 생성하려고 하는 커맨드를 입력하는 도중, env.py 에서 내 프로젝트의 app 모듈을 찾지 못 하는 ModuleNotFoundError 에러가 떴다. 원인 어떠한 이유에서 Alembic은 커맨드를 실행할 때, local "." 경로를 sys.path에 추가하지 않는데 그래서 프로젝트의 모듈을 못 찾는 것 같다. 해결 alembic.ini로 가서 아래 코드의 주석을 해제해주어 local "." 경로를 sys.path에 추가하자. (주석되어있음) prepend_sys_path = . stack overflow :alembic-modulenotfounderror-in-env-py alembic github :해당 에러에 대한 커밋

OAuth(OAuth2.0)란 무엇일까? 소셜로그인이 작동하는 법 사이트에 회원가입을 하지않아도 이미 가지고 있는 아이디를 통해 로그인할 수 있게 만드는 소셜로그인. 많은 사람들이 들어봤거나 사용해봤을 것이다. 이렇게 간편한 로그인은 OAuth를 통해서 구현할 수 있다. 이 OAuth는 무엇이고 어떻게 작동하는 것인지 궁금해져서 이번 기회에 간단하게 정리해보려고한다. What is OAuth? OAuth는 Open Authorization의 줄임말로 보안 위임 엑세스(secure delegated access) 개방형 표준(open standard)이다. 현재 OAuth1.0과 OAuth2.0 두 버전이 존재한다. Open Standard 많은 사람들이 OAuth를 API라고 생각하는데 OAuth는 개방..

Nginx란? 서버를 배포할 때 Nginx 서버를 두고 ssl을 적용했었다. 오늘은 이 Nginx를 자세하게 공부해볼 것이다. Nginx를 검색해보면 주로 다음과 같은 기능을 한다고 한다. Web Server Reverse Proxy HTTP Cache Load Balancer 이것이 무엇을 뜻하는지 하나씩 도장을 깨며 알아보자. Nginx as Web Server 웹 서버는 클라이언트에게 HTTP형식의 요청을 받고 처리를 해준다. 유저가 "사진 나와라 Get!" 하는 요청을 하면 유저의 브라우저에 사진을 보여주고, "글 나와라 Get!" 하면 글을 보여주는 것이다. Nginx는 이 클라이언트의 요청을 최소한의 하드웨어 리소스로 여러 클라이언트에게 동시에 처리하도록 설계 되어 나온 서버이다. 가장 많이 ..

Gradle Gradle이란? 그루비(Groovy) 기반의 빌드 자동화 오픈 소스 빌드 스크립트를 xml이 아닌 그루비(Grooby)로 작성한다. 그루비(Groovy)란? 특정 도메인에 특화된 언어인 DSL(Domain Specific Language) JVM 위에서 돌아가며 Java에 파이썬,루비 등의 특징을 얹었기 때문에 Java와 문법이 유사하다. Gradle wrapper를 이용하여 gradle이 설치되어있지 않아도 사용 가능(버전도 신경쓰지않아도 됨) 확장성이 뛰어나다. Gradle vs Maven Gradle의 Groovy 언어를 이용한 스크립트 작성 vs Maven의 xml 작성 Gradle의 주입 방식 vs Maven의 상속 방식 Gradle이 Maven보다 빌드속도가 더 뛰어나다. Gra..

ServletScope 서블릿에서 변수를 지정하고 객체에 담아 포워드 하려면 객체가 어디까지 유지되는지를 반드시 알아야 마음대로 변수를 가지고 놀 수 있을 것 이다... 서블릿 객체의 각 범위들을 공부해보자! Servlet Scope 서블릿의 스코프는 대략 이런 식으로 되어있다. JSP에서만 움직이는 Page Scope에서부터 애플리케이션 전체를 아우르는 Application Scope까지 하나씩 알아보자. Page Scope JSP 내에서 로 선언되는 것은 해당 JSP 안에서만 사용 할 수 있는데 이런 개념이 Page Scope이다. 그래서 JSP의 지역변수처럼 활용이 가능하다. 클라이언트(브라우저)의 요청이 있을경우 PageContext내장객체의 변수는 JSP 안에서만 머물게 된다. 그러므로 포워드 ..

서블릿 초기화 파라미터 (ServletConfig & ServletContext) 자주 변하는 데이터를 서블릿에 넣어야 한다고 생각해보자. 서블릿 하나하나에 하드코딩을 하게 될 것이다. 이것은 유지보수를 생각하면 옳지 않은 방법이다. 그리하여 선대(?) 개발자들은 DD(배포 서술자)에 변화하기 쉬운 데이터를 설정해주고 서블릿에서는 그것을 파라미터로 받게 만들었다. 이제 데이터가 변경될 때는 DD만 수정하면 되는 것이다! 이 방법에 대하여 공부해보자. ServletConfig 초기화 파라미터 컨테이너는 서블릿을 하나 생성하려고 할 때 하나의 ServletConfig 객체를 만든다. 이 ServletConfig 객체를 이용하여 서블릿을 초기화 시켜줄 수 있다. 과정을 한 번 보자. 과정 서블릿이 만들어질 때..

서블릿 포워드 서블릿 포워드(Forward) 서블릿의 포워드란, 각각의 서블릿끼리 혹은 서블릿과 JSP끼리 연동해서 작업해야 하는 경우 서로 작업을 전달하는 것을 말한다. 포워드의 종류는 다음 네가지이다. redirect Refresh location dispatch (일반적인 포워드 방식) 이 네가지 포워드 방식을 알아보자. redirect HttpServletResponse 객체의 sendRedirect() 메서드를 이용한다. 웹 브라우저(클라이언트)에게서 첫번째 서블릿이 요청을 받으면 첫번째 서블릿이 다시 브라우저에게 응답을 보낸 후 브라우저가 다시 두번째 서블릿에게 요청을 보낸다. 요청을 받은 두번째 서블릿은 다시 브라우저에게 응답한다. WAS에서 객체가 두번 생성되기 때문에 매핑 url이 달라지..

Servlet의 생명주기 서블릿의 생명주기를 알아보려고 한다. 먼저, 서블릿이 동작을 할 때 까지의 과정을 알아보자. Servlet이 동작하려면... 먼저 클라이언트(Web Browser)가 요청을 보낸다. 클라이언트의 요청을 WAS가 받아 HttpServletRequest객체와 HttpServletResponse객체가 존재하는지 확인 한 후, 존재하지 않으면 두 객체를 생성해서 웹 어플리케이션의 서블릿 컨테이너로 전달해준다. 이제 비로서 서블릿이 동작하며 서블릿 라이프사이클이 돌아가게된다. Servlet의 생명주기 Servlet은 init() service() destroy() 이 세가지의 메서드를 돌며 살아간다. init() was에서 객체넘겨줌 -> 서블릿에서 딱 한 번 초기화 init() 메서드는..
중첩 클래스(nested Class) 중첩 클래스란? 다른 클래스 내부에 정의되는 클래스이다. 스태틱 클래스 : 다른 클래스 안에서 독립적으로 존재 내부 클래스 : 자신이 정의된 클래스의 오브젝트 안에서만 존재 멤버 내부 클래스 : 멤버 필드처럼 오브젝트 레벨에서 사용. 로컬 클래스 : 메소드 레벨에서 사용. 익명 내부 클래스 : 이름을 갖지 않는 클래스 익명 내부 클래스 내부 클래스 중에서도 익명 내부 클래스는 이름을 갖지 않는 클래스이다. 익명이라서 그냥 선언과 동시에 오브젝트가 생성이 된다. 그러므로 상속할 클래스나 구현할 인터페이스를 생성자 대신 사용을 해서 이용하며 클래스를 계속 재사용하지않고 오직 구현에만 목적을 둘 경우에 유용하게 사용할 수 있다.(콜백) public interface Tes..
커넥션 풀 Connection Pool 커넥션 풀이란? 데이터베이스가 연결되고 사용하는 과정의 자원 소모를 효율적으로 하기 위하여 연결 부분(Connect) 과 사용(Pool) 부분을 분리 한 뒤 커넥션을 미리 만들어 Pool 속에 저장해 두었다가 가져다 쓴 뒤 다시 Pool에 저장하는 것. 장점 DB 접속에 드는 큰 자원을 효율적으로 관리할 수 있다. 커넥션 수를 제어하여 접속자들을 효율적으로 관리할 수 있다. 기본 DBCP 셋팅(설정파일로 셋팅하는 법) DBCP 라이브러리 추가 common-dbcp common-pool mysql-connector 등등 DBMS 자체의 dbcp 풀 라이브러리 javax.sql 패키지의 DataSource 상속 Dao.java public class MyDAO{ pri..