글을 작성하기 전, 왜 우리는 Clean Code를 학습해야하며, 어떠한 마음 가짐으로 임해야하는지 알아보겠습니다.

 

<나쁜 코드로 치르는 대가>

프로젝트 초반 나쁜코드를 작성하며 번개처럼 속도를 낸다면, 시간이 지남에 따라 개발속도는 늦어집니다.

분명, 초반 개발속도는 매우 빠르고 힘차게 나갈지라도, 1-2년 후 결국 굼뱅이처럼 기어갈 수 밖에 없습니다.

프로젝트의 규모가 커지고 코드들이 얽히고 설킨 상황에 개발자가 코드를 '해독'해서 코딩을 한다면 분명 생산성에

문제가 있을 것 입니다.

 

 

<어떠한 마음가짐으로 코드를 작성해야 하는가?>

저자는 미국 보이스카우트가 따르는 간단한 규칙이 개발자들에게도 유용하다고 설명하고 있습니다.

 

           캠핑장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라.

 

체크아웃할 때보다 좀 더 깨끗한 코드를 체크인 한다면 코드는 절대 나빠지지 않습니다. 

사소하게 변수명 하나 또는 약간의 중복제거와 같은 간단한 코드정리가 쌓이다 보면 결국 프로젝트의 코드는 클린해질 것 입니다.

 

 

<의미 있는 이름>

 

1. 의도를 분명히 밝혀라

   변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 답해야 합니다.

     - 변수(혹은 함수나 클래스)의 존재 이유

     - 수행 기능

     - 사용 방법

   

   따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말입니다.

 

※ 변경 전

public List<int[]> getThem() {
	List<int[]> list1 = new ArrayList<int[]>();
    
    for(int[] x : theList)
    	if(x[0] == 4)
            list1.add(x);
	return list1;
}

 

※ 변경 후

public List<int[]> getFlaggedCells() {
	List<int[]> flaggedCells = new ArrayList<int[]>();
    
    for(int[] cell : gameBoard)
    	if(cell[STATUS_VALUE] == FLAGGED)
        	flaggedCells.add(cell);
	return flaggedCells;
}

변경 전 코드에서는 getThem()함수가 어떤 함수이고, list1은 무엇이며, 상수 0과 4는 무엇을 암시하는지 전혀 알 수 없습니다.

하지만, 변경 후 코드에서는 함수, 변수, 상수가 하는 일을 명확히 알 수 있습니다.

 

<의미 있게 구분하라>

 

1. 연속적인 숫자를 덧붙인 이름을 사용하지 마라.

    - a1, a2, ..., aN 과 같은 이름은 아무런 정보도 제공하지 못하는 이름일 뿐입니다.

 

2. 불용어를 추가하지 마라.

    - 불용어를 추가한 이름은 아무런 정보도 제공하지 못합니다.

    - 만약, Product라는 클래스가 있다고 가정하고 다른 클래스를 ProductInfo, ProductData라 부른다면

      개념을 구분하지 않은 채 이름만 달리한 경우입니다.

      즉, 의미가 불분명한 불용어 입니다.

 

<클래스 이름>

 

클래스 이름과 객체 이름은 명사명사구가 적합하다. Customer, WikiPage, Account, AddressParser 등이 좋은 예다.

Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는다.

 

 

<메서드 이름>

 

메서드 이름은 동사동사구가 적합하다. postPayment, deletePage, save등이 좋은 예입니다. 접근자(Accessor), 변경자(Mutator), 조건자(Predicate)는 javabean표준에 따라 값 앞에 get, set, is를 붙인다.

 

 

<기발한 이름은 피하라>

 

간혹 프로그래머가 나름대로 재치를 발휘해 구어체나 속어를 이름으로 사용하는 사례가 있습니다.

예를 들어, Kill() 대신에 whack()이라 부르거나 Abort() 대신 eatMyShort()라 부릅니다.

특정 문화에서만 사용하는 농담은 피하는 편이 좋습니다. 의도를 분명하고 솔직하게 표현해야합니다.

 

 

<한 개념에 한 단어를 사용하라>

 

1. 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.

   - 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽습니다. 만약 같은 기능을 하는 메서드

     라면 한 가지를 선택해 고수해야합니다.

 

2. 한 단어를 두 가지 목적으로 하용하지 마라.

   - 때때로, 프로그래머는 같은 맥락의 메서드 또는 클래스가 아닌데도 '일관성'을 고려해 한 가지 단어를 고수합니다.

     예를 들어, 지금까지 구현한 add() 메서드는 모두가 기존 값 두 개를 더하거나 이어서 새로운 값을 만든다고 생각해

     봅시다. 하지만, 새로 작성하는 add() 메서드는 집합에 값 하나를 추가하는 기능입니다.

     이 메서드를 add라 불러도 괜찮을까요?

 

     전혀 다른 기능의 add() 메서드입니다. 이름만 같게 지었을 뿐이지요. 그러므로, 새로 추가한 add() 메서드는 insert   

     나 append라는 이름을 사용하는 것이 적당합니다.

'STUDY > IT' 카테고리의 다른 글

[IT] 좋은 글인듯.. 읽어보자  (0) 2020.01.31
[IT] 변수명 지어주는 사이트(개발)  (1) 2020.01.28
[IT] Clean Code 리뷰 시작  (0) 2019.09.07
[IT] 이클립스 javascript 자동완성  (0) 2019.04.04
[IT]REST API란??  (0) 2019.03.02

최근 Clean Code라는 책을 구매해서 읽고있습니다. 아직 1/3 채 읽지 못했지만, 현재까지 읽은 내용을 바탕으로 중요한 내용들을 정리하고 싶어서 글을 작성합니다.

 

최근 코드를 작성하며 '내가 코드를 잘 작성하고 있는가?'라는 물음에 확실한 결론을 내놓지 못했습니다. 분명, 수 많은 사람들의 코드를 접했지만, 각자의 스타일이 다르고 방식이 달랐습니다.

그렇다면 누구의 코드가 클린한 코드일까요? 저도 잘 모릅니다.. ㅎㅎ 그래서  Clean Code책의 도움을 받아 최소한 지켜줘야 할 클린 코드의 규칙을 익히기로 했습니다.

 

책의 내용은 굉장히 만족스러웠고, 책의 내용을 조금이라도 더 이해하고 알리기 위해 포스팅을 시작하게 됐습니다.

(물론, 이해가 잘 안되는 부분도 있지만 코딩을 하다보면 차근차근 이해가 될 것 같습니다. ㅎㅎ)

 

그럼 이제 포스팅을 시작하겠습니다.

 

<클린 코드(로버트 C. 마틴)>

 

 

※ 모든 내용은 위 책을 바탕으로 작성 할 것입니다.

https://doublesprogramming.tistory.com/112

 

Spring - 게시판 만들기 연습 (Rest방식으로 댓글 수정, 삭제 구현하기)

Spring - 게시판 만들기 연습 (Rest방식으로 댓글 수정, 삭제 구현하기) 1. 구현 화면 01) 댓글 상세보기 영역 생성 로그인한 회원 본인이 작성한 댓글에 수정 버튼이 보이도록 처리 수정 버튼을 클릭하면 댓글..

doublesprogramming.tistory.com

https://www.youtube.com/watch?v=X7nbS0kWAgw

한참을 찾아다녔습니다.. 그저 Restful API에 대한 알 수 없는 개념들만 접했지만

 

이렇게 Restful API를 활용해서 게시판의 댓글 수정, 목록, 삭제를 구현한 게시물은 처음 접해봤습니다.

 

그만큼 뜻깊은 게시물이고 몇번이고 돌려봐야할 것 같습니다.

https://wondongho.tistory.com/50

 

Eclipse에 Javascript 코드 어시스트(javascript code assist) Tern Eclipse IDE 구축

유명한 코드 어시스트인 WebClipse를 설치해도 컨트롤 스페이스가 먹히지 않았다.. 그래서 다른 코드 어시스트를 발견하게되었다. 단점이라고 찾아보자면.. 수동 설정을 해줘야하는것정도? 10초면 충분하다. 이름..

wondongho.tistory.com

 

유명한 코드 어시스트인 WebClipse를 설치해도 컨트롤 스페이스가 먹히지 않았다.. 그래서 다른 코드 어시스트를 발견하게되었다.

 

단점이라고 찾아보자면.. 수동 설정을 해줘야하는것정도? 10초면 충분하다.

 

이름은

 

Tern Eclipse IDE !

 

 

설치방법

 

※ WebClipse를 사용하고 계신분들은 Eclipse Marketplace에 들어간후 탭메뉴의

Installed에 들어가신후 Uninstall 하신 후 설치해주시길 바랍니다.

 

Eclipse Marketplace -> Tern 검색 -> Tern Eclipse IDE 1.2.0 설치 후 이클립스 재부팅.

 

그런다음

 

1. 프로젝트별로 수동 설정해줘야 하므로 (10초도 안걸릴것 같음) 적용 하고 싶은 프로젝트를 

우클릭 후 Configure -> Convert to Tern Project 클릭! 

 

2. 스크롤을 내리다 보면 Cordova JavaScript라고 항목이나옴 체크 후 Ok누르면 설정 끝.

 

js 코드 몇글자 입력후 컨트롤 스페이스를 클릭하게 되면 자동완성이 쭈욱 뜬다!!

왠만한건 다되는것 같음!

봐도봐도 잊고 까먹는다..

 

그래서 이번에는 정말 간단하게 정리한 문서를 참조하겠습니다.

 

대충 이해하고 넘어간 다음에 나중에 깊게 이해하면 될 것 같습니다.

 

 

간혹 가다가 웹 페이지가 예상대로 돌아가지 않을 떄가 있다.


예를 들면, JQuery를 사용해서 태그를 숨겼는데 그대로 보이는 경우이다.


이는 페이지가 로드되면서 실행되는 순서가 다르기 때문이다.

 

 

 

<html>
    <head>
        <script src="jquery.js" type="text/javascript"></script>
        <script src="abc.js" type="text/javascript"></script>
        <link rel="stylesheets" type="text/css" href="abc.css"></link>
        <style>h2{font-wight:bold;}</style>
        <script>
            $(document).ready(function(){
                $("#img").attr("src", "kkk.png");
            });
        </script>
    </head>
 
    <body>
        <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
        <script src="kkk.js" type="text/javascript"></script>
    </body>
</html>

 

 

 

 

위와 같은 소스에서 실행 순서는 다음과 같다.


1. HTML 문서 다운로드

2. HTML 문서 파싱 시작

3. HTML 파싱이 3번 라인에 도달

4. jquery.js 가 다운로드 되고 파싱된다.

5. HTML 파싱이 4번 라인에 도달

6. abc.js가 다운로드되고 파싱되고 실행된다.

7. HTML 파싱이 5번 라인에 도달

8. abc.css가 다운로드 되고 파싱된다.

9. HTML 파싱이 6번 라인에 도달

10. <style>태그 내부 CSS 규칙이 파싱되고 정의된다.

11. HTML 파싱이 7번 라인에 도달

12. 내부 Javascript다 파싱되고 실행된다.

13. HTML 파싱이 15번 라인에 도달

14. abc.jpg가 다운로드 되고 보여진다.

15. HTML 파싱이 16번 라인에 도달

16. kkk.js가 다운로드 되고 파싱된 후 실행된다.

17. 페이지 로딩이 끝났으므로 kkk.png그림이 보인다.

18. 끝


* onload함수는 페이지 로딩이 끝나는 이후 바로 실행


* Java, JSLT, HTML, Javascript가 모두 섞여있을 경우, 보기 순서대로 실행된다.

이때, 먼저 실행되는 쪽에서 뒤쪽에서 실행되는 쪽의 값을 읽을 수 없다. 준비가 안됐기 때문.


* 하나의 jsp파일 내에 작성된 소스라 하더라도,

Scriptlet이나 jstl, el 등은 서버단에서 실행되며

Javascript는 브라우저에서 실행되기 때문에 두 언어 간 변수를 직접 주고받을 수 없다.


예를 들어, 다음과 같은 방법으로 직접적으로 변수를 쓸 수 없다. 

 

var list = new Array();
 
list = "${TestList}";
 
alert( list[0].name );

 

 

쓰려면 다음과 같이 해야한다.

var list = new Array(); <c:foreach items="${TestList}" var="item">     list.push("${item.name}"); </c:foreach>

 

 

*Expression Language

${식} 과 같은 방법으로 표현한다.

JSP의 스크립트 요소(스크립틀릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용할 수 있다.

 

 

 

아래글 정말 좋다 꼭 읽어보자

http://blog.devez.net/420

 

[JSP / Servlet] JSP 라이프 사이클(life cycle)과 동작 원리 - Blog Goooood.net

JSP (JavaServer Pages) JSP 파일은 직접 실행되지 못하며 JSP 코드에 해당되는 서블릿을 생성해서 서블릿이 실행되는 방식이다. JSP는 주로 HTML 코드를 응답하기 위한 용도로 사용되며 JSP를 사용하지 않고 서블릿만으도 동일한 기능을 구현할 수 있지만 작성해야 되는 코드가 많다는 단점이 있다. JSP 실행 순서 사용자가 브라우저에서 JSP 주소를 입력했을 때 JSP가 실행되는 순서는 다음가 같다. 브라우저가 웹서버에 요청 정보를 전

blog.devez.net

 

 

 

 

출처 : https://defacto-standard.tistory.com/249

아직 읽어보지 못했지만 꼭 한번 읽어봐야겠습니다.


자바스크립트가 var를 사용하면서 타 언어에 비해 변수의 유효범위가 많이 다릅니다.


왜 var가 아닌 let을 써야하는지 확인해봐야합니다.


https://blog.hanumoka.net/2018/09/21/javascript-20180921-javascript-var-let-const/

REST API에 대한 좋은 강의가 있어서 듣고왔습니다. 아직 웹 개발을 시작한지 오래되지 않아 쉽게 이해할 순 없지만


강사가 어떠한 내용을 전달하고 싶은지는 대충 감을 잡았습니다.


REST API에 대해 궁금하거나 또는, REST API에 대한 지식이 업무에 필요할 경우 다시 찾아보면 도움이 될 것 같습니다.


아래는 제가 봤던 강의 링크입니다.


출처 : https://www.youtube.com/watch?v=RP_f5dMoHFc

spring - 3.txt



1. Spring web.xml이란?


web.xml은 서블릿 배포 기술자 라고 합니다. (설정을 위한 설정파일) web.xml은 WAS(Web Application Server) -> Tomcat이

최초 구동될 때, WEB-INF 디렉토리에 존재하는 web.xml을 읽고, 그에 해당하는 웹 애플리케이션 설정을 구성한다.



web.xml에서 dispatcher-servlet.xml을 호출한다. 만약 호출하는 코딩이 없어도 dispatcher-servlet.xml 자체 이름을 디폴트로

생각하고 호출합니다. (만약 dispatcher-servlet.xml의 파일 이름을 사용자가 임의로 변경한다면, web.xml에 명시해야합니다.)


web.xml의 자세한 내용은 아래 링크에 있습니다.


출처 : 

https://m.blog.naver.com/PostView.nhn?blogId=blogpyh&logNo=221128330192&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


https://gmlwjd9405.github.io/2018/10/29/web-application-structure.html



2. JSTL Formatting 태크란?


JSTL Formatting태그는 이름에서 알 수 있듯이 데이터의 포멧형태등을 정해주고 변경할때 사용하는 태그입니다.

JSTL Formatting을 사용하기위해선 JSP페이지 상단에 선언을 해주셔야합니다.


<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>


JSTL Formatting의 다양한 태그 라이브러리를 확인하거나, JSTL의 다양한 라이브러리를 확인하려면 아래 링크에서 할 수 있습니다.


출처 : https://bvc12.tistory.com/237



3. Exeption을 사용할때, 웹 프로젝트에서는 모든 예외처리를 Controller에서 처리한다. Service, DAO클래스에서는 throws로 컨트롤러까지 예외를 던져준다.



4. error페이지를 처리할 수 있는 곳 ==> Controller, web.xml, HandlerMapping


dispatcher-servlet.xml에서 예외페이지를 처리하는 경우 아래를 참고하여 설정


<!-- Exception Handler..... -->

<bean  class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="org.springframework.dao.EmptyResultDataAccessException">Error1</prop>

<prop key="java.lang.Exception">Error2</prop>

</props>

</property>

</bean>



5. AJAX를 사용할때는 컨트롤러에 어노테이션 @ResponseBody를 넣어줘야 한다.



5. 보안에 따른 view page 저장위치


view page들을 예전에는 WebContent폴더 아래에 새로운 폴더를 생성하여 웹 페이지를 저장했지만, 이러한 기법의 문제는 

웹 브라우저에서 주소창에 직접 주소를 입력하여 접근이 가능하기 때문에 보안상 좋지않다.

그래서 요즘은 WEB-INF폴더 아래에 새로 폴더를 만들어서 웹 페이지를 저장한다.

이러한 방식은 웹 브라우저에서 직접 주소를 입력하여 접근할 수 없으므로, 보안상 좋다.



6. AJAX를 사용할 경우, XML데이터는 무조건 VO(DTO)로만 데이터가 이동 가능하다. int, String, Map, List와

같은 자료형은 데이터 이동이 불가능하다. (그래서 보통 JSON을 사용한다.)



7. Java는 DB연결에 있어서 무조건 try catch를 사용해서 에러를 잡아줘야하지만, Spring에서는 모든 에러를

Runtime exception을 상속받고 있어서, 따로 처리하지 않아도 에러는 나지 않습니다.



<질문>


session id를 쿠키에 저장해서 이동하는데 만약 사용자가 쿠키기능을 막으면 ??


답변 : 쿠키 기능을 완전 막으면 session기능은 사용할 수 없습니다. 따라서, 세션을 사용한다는 의미는 쿠키를 사용한다는 의미와 같습니다.


프로세스 -> 싱글톤 => 싱글톤인데 프로세스 여러개 생성가능?

스레드 -> 싱글톤 => 메모리 과부하 ?? 어떻게 여러명이 하나의 클래스파일을 로드할수있지?

스레드 -> 싱글톤x => 프로세스로 생성하는거랑 무슨차이?



답변 :  - 만약 웹 서비스를 프로세스 단위로 사용자에게 제공하면 싱글톤의 의미자체가 없다.

         - 웹 서비스를 스레드 단위로 사용자에게 제공하면 싱글톤의 유무가 중요하다. 만약 싱글톤을 사용하지 않는다면,

           사용자들은 지속적으로 클래스파일을 로드하여 메모리에 문제가 생길것이다.

           그러나, 싱글톤을 사용한다면 사용자들은 하나의 클래스 파일을 카피하여 사용하므로, 메모리관리에 효과적이다.

           (내용정리가 필요할듯 ....)


db커넥션풀에는 아래와 같은 계정이 생성된다. 하나의 계정으로 모든 사람이 접속하는건가?


<context:property-placeholder location="classpath:/config/jdbc.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close">

<property name="driverClassName" value="${jdbc.driverClassName}"/>

<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

<property name="maxActive" value="${jdbc.maxPoolSize}"/>

</bean>


답변 : 그렇다. bean객체로 생성한 하나의 계정을 DB커넥션풀에 생성하여 사용자들에게 계정을 빌려준다. (보통 5개 이상 만들지 않습니다. 그만큼 계정의 사용과 반납 과정이 빠릅니다.)

교육내용을 잊어버리기 전에 다시 정리합니다.


Spring - 2.txt



1. 하드웨어 성능향상에 따른 개발론


   - 요즘 하드웨어가 좋기때문에 성능이슈보다 유지보수확장성에 집중하여 개발한다.

      (예전 성능이슈때문에 유행했던 알고리듬이 요즘 다시 곽광받고 있는 이유는 AI와 빅데이터 때문이다.) 



2. XML은 플랫폼 독립적으로 동작한다.


    A. XML

       

       - Extensible Markup Language의 약자로, 마크업 언어를 정의하기 위한 언어, 확장이 가능한 언어이다.


    B. HTML과의 비교

   

       - HTML과 흡수한 Markup language이지만 Tag를 정의할 수 있고 데이터를 기술할 수 있는 마크업 언어이다.

         XML은 데이터가 무엇인지에 초점을 맞춰 데이터를 기술하기 위해 고안되었고

         HTML은 데이터가 어떻게 보일지에 초점을 맞춰 데이터를 표시하기 위해 고안되었다.


     C. 탄생배경

  

        - XML이란 전자적으로 데이터를 교환하기 위한 표준이다. HTML의 한계를 극복하고 SGML의 복잡함을 해결하는

          방안으로써 탄생하였다.


        - 웹 상에서 구조화된 문서를 전송 가능하도록 설계된 표준화된 텍스트 형식의 마크업 언어로써 인터넷에서 바로

          사용가능한 문서를 표현하는 표준이다.


     D. 특징


        - 기존 웹의 인터넷 기반 프로토콜, 매커니즘과 함께 사용할 수 있다.


        - 언어에 대해 독립적이고 여러 Application을 사용 가능하도록 지원한다.


        - 사용자 정의 태그를 사용한다. 때문에 정보 교환이 용이하다.


        - 문서 재사용이 가능하다.


        - 웹에서 정보 교환이 가능하다.


        - 자료의 표현과 내용이 분리되어있어 정확한 검색이 가능하고 교환에 용이하다.



        XML은 어떠한 데이터를 설명하기 위해 이름을 임의로 지은 태그를 데이터로 감싼다.


출처 : https://asfirstalways.tistory.com/98



3. XML - JSON - YAML - CSV 언제 사용하고 어떤걸 선택해야 하는가?



출처 : https://stackoverflow.com/questions/34723651/xml-json-yaml-or-csv-for-storing-articles-on-server



4. IDL이란??


인터페이스 정의 언어 (Interface  Description Language 또는 Interface Definition Language, IDL)는 소프트웨어 컴포넌트의

인터페이스를 묘사하기 위한 명세 언어이다. IDL은 어느 한 언어에 국한되지 않는 언어중립적인 방법으로 인터페이스를

표현함으로써, 같은 언어를 사용하지 않는 소프트웨어 컴포넌트 사이의 통신을 가능하게 한다. 예를 들면, C++을 사용하여

작성한 컴포넌트와 자바를 사용한 컴포넌트 사이에서 국한되지 않고, 인터페이스를 묘사하는 개념이다.


<IDL의 특징>


  - IDL은 특정 언어에 독립적인 인터페이스 정의 언어이다. 따라서, 구현 언어가 아닌 정의 언어이며, 구현언어로의 매핑을

    지원한다.


  - IDL은 객체지향 개념을 기초로 하고 있으며, 다중상속 및 동적 호출 매커니즘을 지원한다.



출처 : https://blog.naver.com/neos_rtos/30185472655



5. GOF디자인 패턴에 대한 내용 (Spring은 많은 디자인 패턴을 내포하고있다.)



출처 : https://gmlwjd9405.github.io/2018/07/06/design-pattern.html





6. 클래스 다이어그램 내용 정리 (개발자들과의 의사 소통을 위해 필수로 익혀야한다.)



출처 : https://gmlwjd9405.github.io/2018/07/04/class-diagram.html




7. Spring AOP에 적용된 Proxy


d스프링은 프록시를 이용하여 AOP를 구현합니다. 스프링은 Aspect의 적용대상이 되는 객체에 대한 프록시를 만들어

제공합니다. 비즈니스 로직에 접근할 때 대상 객체로 바로 접근하는게 아닌 프록시를 통해서 간접적으로 접근하게 됩니다.

이 과정에서 프록시는 공통 기능을 실행한 뒤 대상 객체의 실제 메서드를 호출한 후에 공통 기능을 실행합니다.

                                           


출처 및 참고 : https://minwan1.github.io/2017/10/29/2017-10-29-Spring-AOP-Proxy/

                   https://jojoldu.tistory.com/71




<AOP에 대한 필기 내용>


app.xml에서 aop를 정의할 때 return값, 메소드명, 파라미터는 생략할 수 없다.

     ( ex. execution(* search(int)) ) ==> 해당 메소드가 보이면 무조건 aop를 적용시킨다.

                        - * : return value

                        - search : mthod name

                        - int : prameter name



annotation으로 AOP를 설정하려면  app.xml에 <aop:aspectj-autoproxy/> 를 입력해야한다.






8. @Autowired는 @Component를 상속하고 있는가?


상속받지 않습니다. 둘은 다른 개념입니다.


@Component

@Service

@Repository

@Controller

등의 spring stereo type @Annotation 이 붙은 클래스들은 

스프링 어플리케이션이 기동될 때 자동으로 검색되어 객체가 생성되고, 스프링에 의해 관리됩니다.


@Autowired 는 스프링에 의해 관리되고 있는 빈 객체를 스프링이 알아서 주입해달라는 용도입니다.



출처 : https://okky.kr/article/357029



spring.txt

교육을 듣고 곧바로 내용정리를 해야하는데 밥먹고 몸이 나른해지니 늦게 글을 씁니다 . . . .


좀 더 부지런하게 움직여야하는데, 내일은 퇴근하고 바로 작성해야지요.. !


전체적으로 중요한 내용 또는 내가 이해하지 못했던 내용들을 위주로 자세히 풀어나갈 것 입니다.



1. 객체지향 기반 5대 원칙


  A. SRP (단일책임의 원칙 : Single Responsibility Principle)


      - 작성된 하나의 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중

        되어 있어야 한다는 원칙.


      - 클래스는 자신의 이름이 나타내는 일을 해야 합니다. 올바른 클래스 이름은 해당 클래스의 책임을 책임을 나타낼 수 

        있는 가장 좋은 방법입니다.


  B.  OCP (개방폐쇄의 원칙 : Open Close Principle)


      - 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원리입니다.

        이것은 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화 해야 한다는 의미로, 요구사항의 변경이

        나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용

        할 수 있어야 한다는 뜻입니다.



더 많은 내용은 아래 링크 


출처 : http://www.nextree.co.kr/p6960/



2. 멀티 프로세스(Multi Process)와 멀티스레드(Multi Thread)


   A. 멀티 프로세스 특징


      - 부모 - 자식 관계라고 해도 자신만의 메모리 영역을 가지게 된다.


      - 환경변수와 프로세스 핸들 테이블이 상속 가능할 뿐 결국 독립적인 관계이다.


      - fork를 통해 프로세스를 복사한다.


      - 유닉스 계열에서 ps 명령어로 현재 수행되고 있는 프로세스를 확인할 수 있다.

  

      - 프로세스 간의 통신을 하려면 IPC(Inter Process Communication)를 통해야 한다.


           


    B.  멀티 스레드 특징


       - 하나의 프로세스가 다수 개의 작업을 각각 스레드를 이용하여 동시에 작동 시킬 수 있다.


       - 스레드는 다음과 같은 공유 메모리를 가진다.


        



   C. 멀티 스레드는 멀티 프로세스에 비해 상당한 이점을 가진다.


      1. 컨텍스트 스위칭(Context Switching)시에 공유 메모리 만큼의 시간(자원) 손실이 줄어든다.

          : 프로세스 간의 컨텍스트 스위칭시 단순히 CPU 레지스터 교체 뿐만이 아니라 RAM과 CPU사이의 캐쉬메모리 대한

            데이터 까지 초기화 되므로 상단한 부담이 발생한다.


      2. Stack을 제외한 모든 메모리를 공유하기 때문에 global(전역), static(정적)변수 그리고 new, malloc에 의한 모든 자료를

         공유할 수가 있다.

          : 이는 프로세스간 통신(ex. pipe)과 같이 복잡한 과정을 거치지 않고 보다 효율적인 일처리가 가능하다는 것을 뜻한다.

            (핸드 테이블과 환경변수는 덤이다.)


출처 : https://you9010.tistory.com/136



3. HTTPD란?


   httpd란 HTTP Protocol을 지원하는 daemon입니다. HTTP Protocol이란 통신규약중 하나로서 브라우저에서 해독가능한

   파일, 즉 HTML 파일을 전송해주는 규약입니다. 마찬가지로 FTP를 지원하는 daemon은 ftpd이며, telnet을 지원하는

   daemon은 telnetd입니다. httpd란 다른말로 http를 지원하는 서버라 할 수 있으며, 우리가 흔이 Web Server를 구축한다는

   말은 좁은뜻으로 httpd를 수행한다는 말과 같습니다. 현재 전세계적으로 가장 많이 사용되는 httpd로는 apache이며, 이는

   Open Source로 제공하기 때문에 Linux의 기본 httpd입니다.



4. Spring Framework LifeCycle



브라우저로 부터 요청(Request)을 받고 응답(Response)하기까지 Spring MVC의 처리 흐름은 위와 같다.


※ Contoller, Service, DAO는 개발자가 구현하는 부분이고, 객체를 생성하고 관리하는 것은 DI기법으로 관리한다.


1. 먼저 브라우저로부터 요청이 들어오면 일단 Filter을 거치게 된다. Filter에서 하는 대표적인 처리를 보면 Encoding이 있다.




2. 다음으로 DispatcherServlet이 Controller에 요청을 전달하기 전에 가로챈다. 요청을 가로챈 후 HandlerMapping을 통해

   요청에 해당하는 적절한 Controller을 찾게 된다. 그리고 DispatcherSelvlet에 그것을 전달한다.


3. DispatcherServlet은 실행할 Controller정보를 HandlerAdapter에 전달하게 된다.


4. HandlerAdapter는 해당 Controller를 호출하게 된다.


5. Controller에서는 전달된 요청을 처리한다. 예를 들어 게시판의 글 목록을 가져오는 요청을 받으면 Controller는 게시판

   Service를 호출하고 Service에서는 DAO를 통해 게시판 글 목록을 가져오게 된다.


요청을 처리한 후 그 결과를 Model에 담고, View의 이름을 HandlerAdapter에게 전달하게 된다.


6. 전달받은 View의 이름을 가지고 ViewResolver에서 매핑된 View를 찾아서 반환한다.


7. DispatcherServlet은 반환된 View를 넘기게 된다.






※ 글을 작성하는 도중 갑자기 브라우저가 다운되어 전부 날아감.. 너무 화가나고 손이 바들바들떨림..

   고로 그냥 수업시간때 받아적은 텍스트 파일을 첨부.

   어차피 아래에 큰 내용은 없으니까 가볍게 읽을 수 있음.......

















+ Recent posts