5월, 2018의 게시물 표시

[JSP] DAO, DTO, EL, JSTL, 패턴

DAO - Database Access Object DB에 접근하는 오브젝트, 데이터로 접근하여 데이터의 가공을 담당하는 오브젝트이다. DAO를 통해 데이터의 생성, 업데이트를 실행한다. DTO - Database Transfer Object DB에 접근한 뒤 결과를 받아오는 오브젝트. DTO는 DB로부터 받아 온 데이터를 Object로 변환해서 이를 ResultSet에 저장한 뒤 가지고 있는다. PreparedStatement 원래 Statement는 String query를 정의해주고 stmt.executeQuery(query) 방식으로 많이 사용했다. query문의 가독성도 안 좋고 데이터를 여러개 넣어야 한다면 중복이 많이 발생해버리는 문제가 생겼다. 커넥션 풀 -? EL : JSP의 표현식을 쉽게 바꿔줌 request.getParameter("id")가 ${param.id}가 되는 기적... 자바 빈에도 적용이 가능하다. <jsp:useBean id, class, scope>설정 후 <jsp:setProperty name, property, value>로 값을 다 넣어준 후에, 정해진 scope내에서 ${name.property}로 value를 불러올 수 있다. ㄸ JSTL JAVA SErVER Tag LIBRARY인가봄. 기존 <% %> 로 너저분하게 쓰여지던 코드들이 JSTL을 쓴다면 아주 깔끔하게 정리될 수 있다. 주로 <c:> / 프론트 컨트롤러, 커맨드패턴 1) 디렉토리 패턴 / 2) 확장자 패턴 requestdispatcher와 redirect의 차이? - 요청객체가 오리지날이냐 아니면 뉴이냐.

[JSP] 에러페이지 처리

웹페이지를 서핑하다보면 에러가 나는 경우가 있다. http 프로토콜엔 미리 정의된 상태코드가 있다. 코드별 증상이 모두 다른데 대표적인 코드/증상으로는 200 - 성공 (정상적으로 페이지가 노출됨) 300대 - 리다이렉트 관련 404 - 찾고자 하는 URI가 없음 500 - 서버내부오류 등등 많이 있다. 어쨌든 어떤 상황에서든지 에러가 발생하면 Tomcat에선 자동으로 에러 페이지를 띄워주는데 이 페이지는 사용자 친화적이지 않고 보안상 이슈가 발생할 여지도 있기 때문에 사용자는 반드시 에러페이지를 따로 정의해주어야 한다. JSP에서는 에러페이지를 정의하는 방법이 2가지 있다. 1) JSP 지시자로 에러페이지 정의하기 2) Web.xml로 에러페이지 정의하기 1)의 경우엔 뇌의 용량이 아까울 정도로 비효율적인 방법으로 생각되므로 그냥 저런게 있다 하고만 넘어가고 2) 방법을 살펴보자. JSP파일을 실행하면 Web.xml 파일이 있을 것이다. 이 Web.xml은 이제는 익숙해졌다시피, 확장 된 마크업이다. Web.xml파일 내에 그냥 아래처럼 추가해주면 그걸로 끝이다. <error-page> // errorpage 태그 <error-code>404</error-code> // 이 error code가 발생하면 <location>/error404.jsp</location> // 이 페이지로 이동하세요 </error-page> 엄청 간단하지 않은가? 하지만 모든 에러코드를 저렇게 일일히 지정해주는 것은 생각만해도 귀찮은 일이다. 그렇다면 지정하지 않은 모든 에러가 발생했을 때, 범용적으로 쓸 수 있는 페이지를 하나 만들어 두는 것도 좋을 것이다. 마찬가지로 Web.xml 파일 내에 아래 코드를 추가하면 된다. <error-page> <exception-type>java.lang.Throwable</except...

쿠키, 세션

쿠키 쿠키는 내가 알고 있는 그 쿠키다. 그렇다. 쿠키 어원썰은 여러개 있다지만 헨젤과 그레텔에서 아이들이 쿠키조각을 흘리고 간 것에서 유래해서 사용자가 흘리는 데이터, 쿠키라는 이름을 붙은 썰이 있다. 어쨌든, 쿠키의 특징을 간추리자면 1) 클라이언트 사이드에 저장된다. 2) 최대 4kb, 300개 데이터까지만 저장이 된다. 3) 보안에 취약한 편이라 요즘엔 잘 안 쓰인다는 것. HTTP는 무상태성 프로토콜이다. 즉, 한 번의 요청과 응답이 끝나면 연결을 끊어버린다. 따라서 클라이언트의 상태나 정보를 서버가 계속해서 Keep해둘 수 없다. 쿠키 (혹은 세션)이 없다면 인증이 필수인 페이지에선 반드시 로그인을 해야 하는 불편함이 있을 수 있다. JSP에서 쿠키를 사용하는 간단한 흐름은 아래와 같다. 1) Cookie 객체를 생성하고 생성자에 "키", "밸류" 값을 파라미터로 준다. 2) Cookie 의 속성을 설정한다. (지속시간) 3) response 객체에 생성한 Cookie 객체를 담는다. 4) response를 받은 쪽은 request 내장 객체의 메소드인 getcookies() 를 통해 Cookie 정보를 가져올 수 있다. 세션 세션은 서버에서 동작하는 쿠키라고 이해해도 될 정도로 쿠키와 그 역할이 비슷하다. 다만 쿠키의 단점을 보완해주는 측면이 있고 클라이언트에 저장되지 않고 서버에 저장되므로 서버에서 클라이언트별로 ID를 발급해준다. 특징은 1) 서버 사이드의 하드디스크가 아닌 메모리에 상주한다. 2) 용량에 제한이 없다. (메모리가 받쳐주는 한) 3) 정보를 얻기 위해선 서버사이드에 직접 접근해야하므로 쿠키보다 보안이 우월하다. 4) 서버에서 클라이언트 요청이 들어올 때 자동으로 세션을 발급해주어 클라이언트 별로 ID를 하나씩 보유하게 된다. -> 이 때문에 세션은 새로운 세션객체를 만드는 것이 아니라 속성을 세팅해주는 메소드를 사용한다.

로컬 Tomcat 서버 실행속도 개선

Eclipse에 Tomcat 8.5를 연동한 후에 서버를 실행할 때마다 속이 터지는 줄 알았다. 한 번 실행하면 근 10초를 넘게 기다려야 하니 습관적으로 코드를 수정하면 계속해서 10초씩 날려먹는게 너무나 아까웠는데.. 인터넷 서핑하며 방법을 찾아보고 적용하니 성공적! 평소 실행속도 16~18초 걸리던 것이 이제 1초 이하로 나온다. 수정한 항목은 총 3개이다. 먼저 Tomcat 서버 폴더\apache-tomcat-(버전)\conf로 진입 1. catalina.properties 파일 수정 파일을 열고 보면 tomcat.util.scan.StandardJarScanFilter.jarsToSkip=.............// 굉장히 긴 코드가 있다. 아래처럼 모든 jar파일을 Skip하도록 바꿔주자. tomcat.util.scan.StandardJarScanFilter.jarsToSkip= *.jar * 18/8/1 추가 : 당시에는 jar가 뭔지도 모르고 속도 개선만을 위해 저렇게 모든 jar Scanning을 Skip하도록 변경했는데 사용하는 jar가 util에 있다면 주의해야 할 것 같다. 하지만 가끔씩 util에서 불러오는 라이브러리를 소스코드에서 import 하면 정상작동한다. 2. Context.xml 파일 수정 파일 내 Context 태그 안에 <JarScanner scanClassPath="false"/>를 아래와 같이 추가한다. <Context>     <JarScanner scanClassPath="false"/>     <!-- Default set of monitored resources. If one of these changes, the    -->     <!-- web application will be reloaded.      ...

[JSP] Tag

JSP has tags that are used in HTML script. Normally it is called "Scriptlet", as may expected, when Java source is embedded in other platform, ~elt is coming after the word and combined. Applet, Scriptlet, Servlet. Those are good examples. Anyway, there are some frequently used Tags in JSP. <% context %> The normal tag and is called "Scriptlet" It can be thought as "Java code inside between % codes". And Scriptlet codes are interpreted, compiled at WAS before the JSP page is responded on Web Browser. That's why Scriptlet code is no where when you look up in HTML Source. <%! context %> This is called Declaration. This code is used when you declare any variable, method or anything you need to declare before you use. <%! int i = 0; %> <%@ context %> This is called Directives. You can import Java library by using it, or even can include another JSP page inside the JSP that you are working on. Just like below. <...

[JSP] JSP 기본

JSP는 Java Server Page이다. html 코드 내에 Java의 코드가 삽입되어 있다고 생각하면 쉽다. 그래서 JSP 파일도 html 코드와 상당히 유사한데 실행되는 과정은 좀 특이하다. 1) Web Browser에서 JSP를 요청한다. (localhost/example/index.jsp) 2) JSP는 Servlet으로 변환이 되어 실행된다. 이 과정에서 index.jsp는 java 소스가 되어(정확히는 Servlet이 되는 것이다) .java의 확장자를 가진 파일로 변경이 되고 jsp는 파일명 뒤에 언더바와 함께 붙는다. (index_jsp.java) 3) 생성 된 Servlet은 메모리에 상주하기 위해 다시 class 형태로 변모하고 메모리에 상주하기 시작한다. (index_jsp.java가 index_jsp.class가 된다. 따라서 서버 내 디렉토리에도 index_jsp.java, index_jsp.class 모두 볼 수 있다.) 4) index_jsp.class는 웹 브라우저에게 html형태로 응답을 준다. 즉, jsp가 바로 응답하는게 아니라 Servlet으로 클래스로 변환 된 뒤에 나온 결과를 html 형태로 전달하는 것이다. Then why? any pros? My opinion is Yes. Think about how Servlet works. Servlet creates its object when it is first initialized. And the Servlet object stays on memory unless the server is terminated or someone modifies the code to restart the server. When the JSP is first called, it has go through all four steps like I wrote above to be a Servlet file, which means it doesn't n...

[Servlet] Servlet 생성시 초기화방법, 용도 / Listener Servlet

1. Servlet을 초기화 하기 Servlet은 생성과 동시에 parameter를 불러들여 자신의 멤버로 가진 채 생성될 수 있다. 이렇게 Servlet을 초기화 하는 방법은 두 가지가 있다. 1) web.xml 파일에 Servlet을 Mapping하고 Servlet 태그 안에 init param 태그를 추가하는 방법이 그 첫 번째이고 2) 그리고 Servlet java 코드에서 Annotation으로 처리하는 방법이 있다. 이 전에 URL을 Mapping해주는 annotation을 배웠다. @WebServlet("/URL") <<< 사실 이 annotation은 url mapping외에도 초기화 역할까지 수행할 수 있었다. 바로 이렇게. @WebServlet(urlPatterns={"/Login"}, initParams={@WebInitParam(name="id", value="abcd")}) 와 같은 방식으로 말이다. 일단 보는 사람은 xml이 보기 좋을 것 같고 코딩하는 사람은 annotation이 편할 것 같다. 그렇다면 이 Servlet의 초기화는 어느 경우에, 어떤 parameter를 가지고 쓰게 될까? 2. Listener Listener에 대해서 알아보자. Listener는 Context가 실행되고 종료되는 것을 감지하고 지정한 메소드를 수행하는 Servlet을 말한다. 그래서 Context가 실행/종료될 때 수행해야하는 메소드를 당연히 Override해야한다. public class Listener implements ServletContextListener{ @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("Server destroyed"); } @Override publ...

[Servlet] Servlet을 통해 post로 전송 된 데이터 받기

어제 JSP에서 FORM send, POST 방식으로 보낸 한글 데이터가 자꾸 깨져보이는 현상이 있었다. 이미 나와 같은 시행착오를 겪은 사람들이 상당히 많았는지 구글에 많은 데이터가 있었는데 방법들이 다 먹히지 않는 것이다. GET 방식으로 보낸 데이터는 구글링 신공으로 금방 처리했는데 유독 POST만 잘 안나왔다. 한 시간을 넘게 삽질했고 원인을 찾아 해결했다. (엄청나게 허무.....) 1) 서버의 web.xml 파일 내 코드 주석 해제     <filter>         <filter-name>setCharacterEncodingFilter</filter-name>         <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>         <init-param>             <param-name>encoding</param-name>             <param-value>UTF-8</param-value>         </init-param>         <!-- <async-supported>true</async-supported> -->     </filter>    중략     <filter-mapping>         <fi...

[JSP, Servlet] 첫 JSP파일, Servlet 파일 만들기

JSP JSP는 Java Server Page이다. 쉽게 이해하자면, HTML을 기본 토대로 하되 Java의 코드도 HTML 안에서 돌아갈 수 있도록 만든 페이지라고 생각하면 된다. 덕분에 정적페이지가 아닌 동적페이지 (html 페이지 내의 컨텐츠가 유저/환경/시간에 따라 변하는 페이지)를 처리할 수 있고 HTML 안에 삽입 된 Java코드이다보니 전체 소스코드를 보면 마치 html안에 불청객이 들어와 있는 모습 같다. Servlet 1) 기본 Servlet은 Java Code(클래스)이고 HttpServlet 클래스를 상속받는다. Eclipse에서 Servlet 파일을 생성하면 자동으로 클래스가 생성되고 해당 클래스 내에서 doGet, doPost 메소드를 오버라이드 하도록 되어 있다. 각각의 메소드들은 request, response를 파라미터로 받는다. 이는 클라이언트의 요청을 request라는 객체로 만들어서 수신하고 반대로 응답을 줄 때의 내용을 response라는 객체로 만들어서 발신하기 위함이다. 따라서 response를 줄 때는 웹브라우저가 해석할 수 있는 데이터 타입으로 데이터를 전송해주어야 하고 이는 setContentType("text/html") 을 통해 내가 지금 전달하는 객체의 타입이 text/html이라는 것을 알려줄 수 있다. response객체의 getWriter 메소드를 사용할 수 있다. 본 메소드를 실행하면 PrintWriter라는 데이터 타입의 객체를 생성하게 되는데 이는 html을 향하는 output stream이라고 보면 된다. response.getWriter();를 통해 outputstream이 생성되었다면 response.getWriter().println("텍스트")를 통해 웹브라우저에게 텍스트를 송출할 수 있다. 2) 라이프 사이클 다른 언어와 Servlet의 차이점이 있다면, Java의 Servlet객체는 처음에 필요할 때 생성되...

5/8 생활코딩 JAVA - 참조, 클론, 제네릭. 콜렉션

5/8 커리큘럼: 참조 ~ 끝 1. 기본 데이터형과 참조형 데이터형의 차이? - 기본 데이터형은 소문자로 시작. 그리고 변수에다 값을 지정할 때 값의 데이터타입이 기본 데이터형이라면 변수가 차지하는 메모리 자체에 값이 저장 됨. - 참조형 데이터형은 대문자로 시작. 변수에다 값을 지정할 때 값 자체가 변수에 저장되는 것이 아니라 그 데이터의 주소값이 저장 됨. (실제 값은 다른 메모리에 위치 함) 2. clone clone은 객체를 복사해주는 메소드다. (a.clone(); < a 객체 복사) 다만 바로 쓸 수 있는 건 아니고 클래스가 인터페이스를 임포트 해줘야 한다. (classname implements Cloneable) 하지만 implement한다고 바로 쓸 수 있는 건 아니다. Colneable은 내용이 없는 빈 인터페이스이다. 다만 clone()은 protected라는 접근제어자를 가지고 있다. 따라서 구현하는 쪽에서 접근권한을 잘 처리해주어야 한다. 그리고 clone은 (runtime exception이 아닌) 일반 exception을 throw하기 때문에 반드시 예외처리도 해주어야 한다. 3. 제네릭 제네릭은 데이터타입을 유연하게 지정해줄 수 있는 기능이다. 같은 로직을 지녔지만 클래스들의 이름(데이터 타입)이 달라서 코드 중복이 생기는 문제는 제네릭으로 해소할 수 있다. 제네릭이 없었을 때엔 데이터타입이 안전하지 않았을 것이다. 즉, 지정하지 않은 타입의 데이터가 들어오거나 의도치 않은 데이터타입이 들어오는 현상을 데이터 타입이 안전하지 않다고 하는데 제네릭을 통해 데이터타입의 안정성을 보장해줄 수 있으며 코드양도 줄일 수 있어 추가되었다. 제네릭은 메소드의 매개변수처럼 여러 개의 데이터타입을 받을 수 있고 생략도 가능하다. 아래 두 코드는 동일하게 동작한다. EmployeeInfo e = new EmployeeInfo( 1 ); Integer i = new Integer(...

5/14 인프런 Java 공부 내용

Interface? 디자인패턴에서 다시 한 번 보자. 객체 구현을 위한 작업명세서라고 볼 수 있다. 추상클래스와 다른 점은, 추상클래스는 추상, 일반 메소드, 일반 변수를 가질 수 있지만 인터페이스는 추상메소드와 상수만 가질 수 있다는 것이다. 기억하자, 상수와 추상 메소드만 존재한다. 다형성? 다형성이란 것은 인터페이스와 항상 짝을 이루는 것이 설명하기 좋은 것 같다. 다(양한)형(태를 가진) (속)성 이다. 인터페이스가 2개 있고 이를 임플리먼트하는 클래스가 1개 있다. 그리고 해당 클래스는 각각의 인터페이스가 요구하는 모든 멤버를 정의했다. 여기까진 문제가 없다. 그리고 클래스의 인스턴스를 생성했다. 그런데 데이터타입이 클래스가 아니라 구현한 인터페이스이다. 이 경우 해당 인스턴스는 (본인 인터페이스 외)클래스의 모든 멤버를 사용할 수 있을까? 그럴 수 없다. 데이터타입이 인터페이스1이기 때문에 인터페이스 1의 멤버만 사용 가능하다. 자 그렇다면 왜 굳이 인터페이스를 나누어서 구현할까? 첫째로는 인터페이스의 목적은 명세라는 역할도 있지만, 데이터타입을 묶어주는 역할도 있기 때문이다. 두번 째로는 클래스를 유동적으로 유연하게 사용할 수 있어야 하기 때문이다. 어떤 경우엔 모든 클래스의 멤버를 구현해야 하는 경우가 있겠지만 또 상황에 따라서는 클래스의 일부 멤버만을 적용해야 하는 경우가 있다. 그런 상황에서 인터페이스의 구분은 적용해야 하는 것을 구분시켜주는 역할을 한다. 그럼 굳이 인터페이스를 구현하는 클래스를 만들어서 인스턴스화 할 것이 아니라 인스턴스를 그냥 인스턴스로 만들면 되지 않는가? 라는 의문이 발생할 수 있지만 인터페이스는 바로 인스턴스화 할 수 없다. 싱글톤 싱글톤이란 한 클래스에서 인스턴스를 생성하고 본 인스턴스가 외부에 전역적인 접촉점을 제공하는 것을 의미한다. OOP가 아니라는 일각의의견도 있지만, 싱글톤이 주는 장점도 있다. DB커넥션이 매번 맺어지는 것보다 싱글톤 패턴으...

5/15 인프런 Java 수강 중 Timer, TimerTask에 관해 궁금한 사항 (쓰레드 공부하고 다시보기)

package com.javalec.api; import java.util.Timer; import java.util.TimerTask; public class TimerEx { public TimerEx() throws InterruptedException{ System.out.println("^^"); Timer timer = new Timer(true); TimerTask t1 = new Timer1(); TimerTask t2 = new Timer2(); timer.schedule(t1, 2000); timer.schedule(t2, 3000); Thread.sleep(5000); System.out.println("done"); } } 처음에 이 코드를 보고 나서는, t1이 실행된 후 2초후에 t2가 실행 그리고 5초후에 쓰레드가 슬립되는 줄 알았는데 아니었다. 모두 병렬로 처리된다. ------(2초에 t1)--(3초에 t2)-------(5초에 슬립)--(done)--> 이다. 메소드를 여러개 정의해두면 사실 순서대로 진행되는 줄 알았는데 이건 좀 다른 케이스인가? 병렬로 실행되는 게 아직은 잘 이해되지 않는데 이 부분은 쓰레드와 관련한 사항같다.

5/11 컴퓨터 싸이언스 with 부트캠프 (인코딩, 함수, call by reference, call by value)

1.인코딩 아스키->유니코드->UTF순으로 진행 아스키코드는 7비트를 사용하는 문자열이라서 0~127개까지의 문자만 표현 가능 다양한 문자를 표현할 수 없어서 이를 보완하기 위해 유니코드 포맷이 등장했다. (U+AC00 형태이다.) UTF은 유니코드 인코딩 방식 중 하나인데, 유니코드가 구체적으로 어떤 방법으로 UTF가 되었는지는 지금 단계에선 잘 모르겠고 굳이 필요하지 않은 것 같다. 일단은 그냥 유니코드 코드포인트를 가진 문자들을 최소 1바이트~최대 4바이트까지 할당한다는 사실만을 알아두자. utf8- 문자를 1바이트~4바이트까지 담는다. utf16 - 문자를 2바이트 or 4바이트로 담는다. utf32 - 문자를 4바이트로 담는다. 2. 함수 함수 안에서 함수를 정의할 때도 지역변수, 전역변수 개념이 inner함수, outer함수에 각각 적용 된다. 따라서 inner함수에서 outer함수의 변수를 쓰려면 변수명 앞에 'nonlocal'을 명시해주어야 한다. 함수는 실행될 때 스택프레임이라는 것이 생긴다. 생성한 변수들은 이 스택프레임이라는 것의 밑바닥 부터 차곡차곡 쌓인다. 함수호출이 끝나면 스택은 사라진다. 이 개념을 알면 call by reference, call by value도 이해할 수 있다. call by value call by reference 함수인자로 변경이 불가능한 객체를 전달하면 값을 변경할 수 없다. 그 이유는 함수 안에서 변경 불가능한 객체는 새로운 객체로 만들어지고 함수 호출이 끝나면 스택 프레임이 사라지며 참조도 사라진다. 함수 내부에서 객체를 새롭게 할당해야만 값을 변경할 수 있는 객체는 변경불가능 객체인 상수, 문자열, 튜플 뿐이다. 리스트나 딕셔너리 같은 변경 가능한 객체도 함수 안에서 만들면 함수 호출이 끝나며 객체는 사라진다. 변경가능한 객체를 인자로 전달할 때도 인자로 전달 된 값에 접근해서 값을 바꾸어야 함수를 호출한...

5/10 생활코딩 Java강의 (Clone, 제네릭 보충)

생활코딩 막바지에 제대로 강의를 듣지 못했던 것 같다. 그래서 Clone이랑 제네릭 부분만 다시 들었고 다른 내용은 나오면 추가로 정리할 예정이다. 1. Clone clone은 객체를 복사해주는 메소드다. (a.clone(); < a 객체 복사) 다만 바로 쓸 수 있는 건 아니고 클래스가 인터페이스를 임포트 해줘야 한다. (classname implements Cloneable) 하지만 implement한다고 바로 쓸 수 있는 건 아니다. Colneable은 내용이 없는 빈 인터페이스이다. 다만 clone()은 protected라는 접근제어자를 가지고 있다. 따라서 구현하는 쪽에서 접근권한을 잘 처리해주어야 한다. 그리고 clone은 (runtime exception이 아닌) 일반 exception을 throw하기 때문에 반드시 예외처리도 해주어야 한다. 2. 제네릭 제네릭은 데이터타입을 유연하게 지정해줄 수 있는 기능이다. 같은 로직을 지녔지만 클래스들의 이름(데이터 타입)이 달라서 코드 중복이 생기는 문제는 제네릭으로 해소할 수 있다. 제네릭이 없었을 때엔 데이터타입이 안전하지 않았을 것이다. 즉, 지정하지 않은 타입의 데이터가 들어오거나 의도치 않은 데이터타입이 들어오는 현상을 데이터 타입이 안전하지 않다고 하는데 제네릭을 통해 데이터타입의 안정성을 보장해줄 수 있으며 코드양도 줄일 수 있어 추가되었다. 제네릭은 메소드의 매개변수처럼 여러 개의 데이터타입을 받을 수 있고 생략도 가능하다. 아래 두 코드는 동일하게 동작한다. EmployeeInfo e = new EmployeeInfo( 1 ); Integer i = new Integer( 10 ); Person<EmployeeInfo, Integer> p1 = new Person<EmployeeInfo, Integer>(e, i); Person p2 = new Person(e, i); 그러나 기본(원시)데이터타...

생활코딩 Java 강의를 모두 들었다

그저께 생활코딩 Java강의 정주행을 완료했다. 역시나 명강의들... 이고잉님은 개발자 출신이 아닌 비전공자 출신이라 그런지 다른 사람이 진행하는 초보자용 강의보단 훨씬 더 이해하기도 쉽고 상세히 알려준다. 중반부까지만 해도 이해가 바로바로 되며 따라가는게 어렵진 않았는데  후반부로 가니 input량도 너무 많아지고 강의에 집중하는게 쉽지 않았다. 거기다가 일단 한 번 가볍게 쭉~ 가보자 라는 생각으로 시작한터라 손으로 직접 코딩도 많이하지 않고 일단은 강의를 듣는 것에 의의를 두었다. 그러다보니 나중엔 그 댓가가 몰려오는 바람에 이론은 따라가지만 손으로 코딩은 하나도 없는 상황에 이르러버렸다. 하지만 조급해하지 않고 다음 강의부터는 들을 때 실습 위주로 진행할 예정이다. 어쨌든, 생활코딩 자바 강의를 들으며 초보자 난이도선에서 자바의 얕지만 넓은 부분을 꽤 많이 만져볼 수 있어서 좋았다. 자바는 객체지향 언어라고 하는데 듣다보니 정말 객체지향의 끝점에 있는 언어라고 느껴질만큼 객체 지향적이라는 생각이 들었다. 파이썬이 방목하고 자식 뜻대로 냅두는 부모님이라면 자바는 엄격한 부모님과 같은 느낌이랄까. 어쨌든 겁 먹었던만큼 그렇게나 어려운 것은 아닌 것 같다. 할만하고, 좀 더 객체지향적이라서 코딩을 괜시리 잘할 수 있을 것 같은 느낌이었다. 다시 듣고싶을만큼 제대로 이해 못한 강의도 2개정도 있지만, 어쨌든  스스로 듣기 시작한 강의를 이렇게 마무리를 지으니 꽤나 뿌듯하다.

5/7 생활코딩 JAVA - 오버로딩, 메소드 시그니처, 접근제어자, 추상, final, 인터페이스, 다형성, 예외처리, Object, equals, 상수/enum

5/7 공부내용 커리큘럼: 오버로딩(복습) ~ 상수, Enum - 원래 오늘 꼭 끝까지 정주행하고 싶었는데 input량이 너무 많다. 무리해서라도 들으라고 하면 들을지 모르겠지만, 전혀 내게 도움이 될 것 같지 않다. 내일은 마무리 지을 수 있을 것같다. - 여태 배우면서 끄덕끄덕하고 다 이해되던 것들이 많았지만, 지금은 좀 복잡한게 많다. 오늘 복습 노트 제대로 읽어봐야할 것 같다. 1) 오버로딩이란? 오버로딩 함수를 정의 하는 법?  자바는 매개변수 타입이나 갯수가 다르다면 다른 함수로 인식한다. 메소드 이름이 같지만 input parameter에 따라 메소드가 다르게 동작하는 방식을 오버로딩이라고 한다. 왜 오버로딩을 쓸까? 매번 같은 취지의 함수를 새로운 이름으로 만들어주면 사용자 입장에선 헷갈리고 코드 양은 많아진다.  만약 하나의 메소드가 매개변수의 속성에 따라 알맞는 메소드를 실행시켜줄 수 있으면 이 문제를 해결해줄 수 있기 때문에 유용하다. 오버로딩할 때 주의점은 매개변수의 이름과 리턴값(형식)은 반드시 같아야 하며 매개변수는 달라야한다는 것이다. (매개변수의 이름은 상관 없다) 2) 메소드의 시그니처란? 메소드의 이름, 매개변수의 형식, 리턴타입 public static void A(int a); {     System.out.println("Hello World!") } 에서 A() : 메소드의 이름 / int a : 매개변수의 형식 / void : 리턴타입 3) 접근제어자의 효용?  접근제어자는 자기 자신이 아닌 다른 클래스에서 자신의 멤버로 접근할 수 있는 '공적인 접근'과 자신 클래스만이 할 수 있는 '사적인 접근'을 나누는 개념이다. 왜 나눌까?  만약 공적인 자원(멤버)를 아무나 침범할 수 있다면 자원에 문제가 생겼을 때 해당 자원에 엑세스 하는 모든 주체들이 혼란스러워질 수 있거나 그 자원의 값이 달라져서 통일성이 없어질 수 있다....

TED 다니엘 핑크의 동기부여과학

요즘 도서관을 왕복하며 TED 영상을 듣거나 봅니다. 오늘은 다니엘핑크의 동기부여과학에 관한 영상을 봤는데, 그 주제는 사람은 무엇으로 동기부여가 되는가? 입니다. 사람을 두 그룹으로 나누고 양 쪽 그룹 모두에게 같은 과업을 줍니다. 한 그룹에게 물질적 보상을 약속하고 다른 한 그룹에게는 아무런 보상 없이 과업 수행을 요청하면, 예상과는 다르게 물질적 보상 없이 과업을 수행한 쪽의 퍼포먼스가 더 월등하다는 사실입니다. 물질적 보상은 아주 쉽고 단순한 Task는 수행자로 하여금 더 빠르고 높은 성과를 내도록 촉진하지만, 문제가 만약 복잡하게 얽혀있다면 물질적 보상은 수행자의 시야를 좁히고 전체가 아닌 주어진 문제를 수행하는데 급급하게 만들어 버립니다. 과거에 비해 context가 점점 더 복잡해지는 요즘 시대의 문제를 해결하기 위해서는 외적인 물질이 문제 해결에 좋은 결과를 내지 않는다는 반증이겠죠. 그렇다면 무엇이 사람들의 성과를 내도록 유도할까요? TED 강의 말미에서 제시하는 동기부여 원천은 3가지였습니다. Autonomy(자율성), Mastery(전문성), purpose(목적)입니다. 본 강의를 다 듣고 난 뒤에 저의 직장생활을 잠~깐 Recap하는 시간을 가졌는데요. 저 3가지는 확실히 제가 직장을 다니며 충족되지 못하고 퇴사 의사결정에 다다르게 하는 것이었습니다.  상사는 언제나 불만이 가득했고 설령 지시한 업무를 수행했어도, 지시하지 않은 업무의 진행상황을 갑자기 물어보며 마치 당연히 진행되었어야 하는데 진행이 되지 않은 것처럼 추궁하는 것을 반복했습니다. 초기에는 그런 추궁이 싫다기보다는 저의 부족함이라 느껴져서 많은 시간을 할애하며 이런 저런 과업을 수행했는데, 1년이 넘게 같은 패턴이 반복되다보니 결국 저도 '그냥 욕먹지 않을 정도로 시키는 것만 하기' 자세를 가졌던 것 같습니다. 일을 하다보면 기존 방식보다 더 좋은 방식이 떠올랐음에도, 상사의 질책과 추궁을 피하기 위해...

5/3 생활코딩 JAVA - 유효범위, 상속/생성자, 오버라이딩, 클래스패스

유효범위는 왜 나왔을까? - 유효범위는 메소드나 변수의 이름이 중복되는 상황을 막기 위해 나왔을 것이다. a라는 변수를 철수도 나도 정의한다면 결국 프로그램이 실행될 때 충돌이 되므로, 각각의 변수와 용어가 어느 범위까지만 유효한지 제한을 둔 것이다. 같은 의미로, 우리는 변수나 그 외의 것들을 정의할 때 전역변수보다는 지역변수로 만들어 객체에서만 유효한 변수를 만드는 것이 좋을 것 같다. int i 와 i의 차이점? - 변수명 앞에 데이터 타입을 기재하는 것은 변수를 선언한다는 의미이다. 만약 선언 된 변수를 그냥 사용하는거라면 데이터타입 없이 변수 이름만을 써야 한다. 그래서 int i는 새로운 정수 type의 변수인 i를 선언한다. 이고 그냥 i는 이미 다른 곳 어딘가에서 정의 된 i를 불러온다는 뜻이다. 초기화가 생겨난 배경은 무엇일까? - 인스턴스를 생성할 때 많은 기본작업이 필요할 수 있다. DB와 연결을 만들어 두어야 할 수도 있고, null값의 변수를 많이 만들어주어야 할 수도 있다. 이런 작업들을 편하게 할 수 있도록 인스턴스를 생성해버릴 때 아예 같이 만들어줘 버리면 시간과 코드를 단축시킬 수 있을 것이다. 따라서 인스턴스의 기본값을 설정해주거나 할 때는 초기값 설정을 하는 것이 도움이 될 수 있다. 이러한 초기값을 설정해주는 녀석을 생성자라고 하고, 생성자를 통해 맨 처음에 시작하고 준비시키는 작업을 초기화라 한다. 생성자란? - 초기화할 때 준비할 여러 항목들을 생성해주는 장치를 생성자라 부른다. 생성자를 통해 처음에 어떤 변수가 어떤 값을 가진 채로 생성될 수 있는지 미리 설정할 수 있다. 자바는 만약 개발자가 생성자를 따로 정의해두지 않았다면, 기본적으로 생성자를 만들어준다. 물론 그 생성자는 빈 값이다. 아무런 값도 없다. 기술을 배우는데 있어 중요한 덕목은 이 기술을 언제 왜 쓸까 고민하는 것 기술에 붙은 이름도 결국 사람 사는 모습 본 떠 네이밍을 한 것이 아닐까 상속이란? - 부모가 자식을 닮듯 부모...

Freemium BM에 관한 Idea

Freemium - 기본기능은 무료로 제공하되 추가 기능은 유료화 하는 과금 정책. 예전에도 이러한 BM은 있었지만 요즘엔 이 freemium정책이 좀 더 자주 보이는 듯하다. 국내 소상공인들을 타겟으로 서비스 중인 자비스도 위와 같은 BM을 채택했고 나도 소비자의 입장으로서 freemium 정책이 반갑다. 원하는 기능은 사용하며 추가적으로 날 편하게 해줄 수 있는 기능들은 추가로 돈을 지불하고 사용할지 말지 선택할 수 있으니까. Freemium 전략의 핵심을 내 나름대로 정의하자면, - 기본기능엔 반드시 핵심기능이 포함되어야 한다. - 부가기능은 핵심 기능의 수평적 확장이 아닌, 수직적 확장이어야 한다. - 부가기능은 날 편하게 해주는 기능이어야 한다. 첫 번째부터 보자. 기본 기능엔 핵심기능이 포함되어야 한다는 것은, 핵심기능이란 그 서비스가 존재하는 이유이다. 메일침프의 경우엔 고객들에게 메일링 해주는 서비스가 핵심기능이다. 자비스는 영수증 처리가 핵심이다. 만약 기본 기능에 핵심기능을 끼워넣지 않는다면 이 서비스는 허들이 높아져 소비자들이 사용하지 않게 된다. 일단은 끌어들이고 (Traffic first) 그리고 확장하는 것이 유효하다 생각한다. (Expand Later) 두 번째로 부가기능은 핵심 기능의 수평적 확장이 아닌, 수직적 확장이어야 한다는 말은 모든 핵심기능은 무료단계에서 쓸 수 있어야 한다는 것이다. 서비스가 제공하는 핵심기능이 단 한 가지가 아닐 수 있다. 어떤 서비스는 1개일 수 있지만 다른 서비스는 2개 혹은 3개까지도 (너무 많으면 중구난방) 제공할 수 있다. 핵심기능이라 판단되는 모든 것들은 고객들이 무료화 단계에서 사용할 수 있어야 하고 이 핵심기능들을 좀 더 하드하게, 의존적으로 사용할 수 있도록 하는 옵션이 필요하다는 것이다. 메일침프의 경우를 예로 들어보자. 2000명의 고객에게 이메일링 하는 것은 무료이지만 (핵심기능의 무료화) 그 이상 고객에게 보내는 것은 유료이다 (핵심기능에 의존...

5/2 생활코딩 JAVA - args 전달방법, 입력값/출력값, 객체지향 프로그래밍, static

5.2 생활코딩 자바 수업 내용 - 수강 커리큘럼 : 입력과 출력 ~ 클래스 멤버와 인스턴스 멤버 - 오늘은 블루홀 인턴 지원서를 작성하느라 공부 시간이 많이 부족했다. 오랜만에 파이팅 있게 입사지원서를 써보니 또 옛 생각도 나고 그렇다. 웹젠, 요꼬가와 같은 곳 지원할때만 해도 엄청 어렸던 것 같은데 어느덧 시간이 또 2년이나 지나 있다니.. 어쨌든 내일은 오전부터 좀 더 해야겠다. 1)  Java 애플리케이션에 입력값을 주는 법? - 현재까지 내가 아는 바로는 main 클래스 뒤에 인자를 붙이는 방식이다. main(String[] args) 파라미터1 파라미터2 << 이런식으로 말이다. 근데 궁금한 게 생긴다. main이 String이 아니라 main(int[] args)가 되는 것은 불가능할까? 이런 경우 내부 처리를 int로만하고 int값을 파라미터로 받는 것은 안 되는 건지..  어쨌든 console환경에서는 argument를 저런 방식으로 주면 되고, 이클립스에서는 Run configuration에 args 탭이 따로 있어 여기에 인자1(space)인자2 이런 방식으로 입력해주면 인자를 전달할 수 있다. 자꾸 인자라고 하네, 파라미터가 맞는 표현이다. (인자는 주는 놈, 파라미터는 받는 놈) 2) 입력값과 출력값은 뭐고, 왜 그걸 만들었을까? 입력값과 출력값이 없을 때는 메소드를 융통성 있게 활용하지 못했을 것이다. 즉 2+4는 늘 6이라는 값만 return하고 2를 10이나 50으로 바꾸고 싶어도 불가능했겠지. 그러다 보니 수식을 하나 만들어 놓고 이 수식에 넣을 값은 내 맘대로 조정하고 싶었을거다. 마침내 그게 되던 순간! 하드웨어와 결합하며 계산기라는 녀석이 세상에 등장하지 않았을까? 어쨌든, 입력값은 어떤 메소드나 로직에 원료가 되는 값이고 출력값은 원료 값을 메소드나 로직에 태운 뒤에 반환되는 값을 말한다. 아마 같은 수식을 사용하고는 싶지만, 유동적인 결과값을 원해서 이렇게 만들어지지 않았을...