"소프트웨어 장인정신"

소프트웨어 장인정신은 소프트웨어 개발자가 스스로가 선택한 커리어에 책임감을 가지고, 지속적으로 새로운 도구와 기술을 익히며 발전하겠다는 마음가짐이다. 소프트웨어 장인정신은 책임감, 프로페셔널리즘, 실용주의 그리고 소프트웨어 개발자로서의 자부심

 

"애자일"

: 단일 개념이 아닌 서로 다른 여러 맥락에 따른 방법론과 테크닉의 조합

: 짧은 피드백 주기의 중요성

 

"카타"

: 품세라는 뜻으로 일본 무예 훈련에서 나온 용어

: 작은 훈련용 코딩

 

"펫 프로젝트"

: 자가 학습/훈련 용 프로젝트

 

"어디로 가고있지 모르고 있다면 결국 가고싶지 않은 곳으로 간다"

: 방향의 중요성

: 방향을 잡기위한 자기계발

 

"나쁜 코드는 암과도 같다"

: 리펙토링의 중요성

: TDD의 중요성

 

 

2020.02.01

반응형

시퀀스다이어그램/플로우차트 그리기 좋은 툴 :

무료

1. bizagi

2. https://www.draw.io/

3. https://www.websequencediagrams.com/

 

YAML file 규격 확인 

4. YAMLlint : www.yamllint.com/

 

반응형

 

1. 네이밍

의미없는 코드값(숫자로 된 코드값), 클래스명 등 사용 금지.

변수명, 함수명만 봐도 어떤 역할을 하는 변수/함수 인지 알 수 있도록 네이밍하기.

※ 실사례

실제로 기존에 해왔던 프로젝트들을 돌이켜 봤을 때, 아무 의미 없는 숫자들로 따져있는 공통코드 및 클래스/함수 명이 상당히 많이 존재했다. 이런 코드들은 외워지지도 않고 프로젝트 내내 개발자들이 명세서를 찾아봐야 하는 엄청난 수고를 하게 만든다. 또한 명세서를 필요 이상으로 철저히 관리 해야하는 스트레스를 받게 한다.

분류가 애매하거나 코드값이 너무 많아 숫자로 분류하는 것은 어쩔 수 없겠으나, 그렇지 않은 경우엔 최대한 삼가해야 한다고 본다.

실제로 다음은 TV광고까지 진행됐던, 국내 최대 통신사 중 하나의, 동접자 2천명 이상의 아이돌 방송 관련 프로젝트를 수행할 때 사용한 공통코드이다. (코드값을 정의한 PM님을 설득하지 못해 어쩔 수 없이 사용했다...)

LV00 : 카메라촬영

LV11 : 앱촬영

MT00 : 멀티뷰카메라촬영

MT11 : 멀티뷰앱촬영

VR00 : VR카메라촬영

VR36 : VR앱촬영

아무 의미 없는 숫자들이 사용됐으며 규칙성 또한 존재한다고 보기 힘들다.

그렇다보니 프로젝트 내내 코드값 의미하는 바가 헷갈려 매번 명세서를 찾아보아야 했다.

위와 같은 코드 값은 아래와 같이 수정할 수 있다.

LVCAM : 카메라촬영

LVAPP : 앱촬영

MTCAM : 멀티뷰카메라촬영

MTAPP : 멀티뷰앱촬영

VRCAM : VR카메라촬영

VRAPP : VR앱촬영

위와 같이 네이밍은 작업능률을 올리고 유지보수성을 높이기 위해 가장 중요하고 따르기 쉬운 규칙이지만,

실제론 가장 지켜지지 않고 있는 악습이라고 생각한다.

 

2. 함수

인자값은 적을수록 좋다(단항함수가 최고)

인자값이 너무 많을 경우 객체를 인자값으로 받도록 설계한다

함수는 하나의 기능만 수행하도록 해라

위에서 아래로 읽히도록 해라

 

boolean 값을 인자값으로 받느니 함수를 별도로 만들어라

※ 실사례

//boolean 을 인자값으로 취하는 메소드 (부적절)
public JsonObject httpUrlConnection(boolean isJson, String targetUrl, String method){}

//boolean 을 인자값으로 받는 대신 아래와 같이 메소드 두개로 분리 (적절)
//isJson 이 false 일 때 사용하는 메소드
httpUrlConnection(String targetUrl, String method){}
//isJson 이 true 일 때 사용하는 메소드
httpUrlConnectionJsonBody(String targetUrl, String method){}
위 함수 2개로 처리

코드결과값보단 예외를 활용하라

※ 실사례

//boolean 을 리턴하는 코드 (부적절)
public boolean ftpFileUpload(...){
   return ftpClient.storeFile(remoteFilePath, inputStream);
}
//예외를 던지는 코드 (적절)
public void ftpFileUpload(...) throws Exception{
   try{
      ftpClient.storeFile(remoteFilePath, inputStream);
   } catch(Exception e) {
      logger.error(e.getMessage);
      throw e;
   }
}

 

3. 주석

주석을 많이 달 시간에 소스 리팩토링을 하라

주석까지 현행화되는 경우는 드물다, 주석을 믿지 말라

정규식, 리턴타입 에 대한 설명, TODO 에 대한 주석은 유용하다(상식적으로 필요한 주석만 달라는 의미같다)

 

4. 형식 맞추기

논리적으로 비슷한 함수끼리 모아서 작성.

함수 1에서 함수2를 호출한다면, 함수1 바로 밑에 함수2를 작성하여 신문읽듯 코드를 읽을 수 있게 작성하라. (호출되는 함수를 호출하는 함수에 가까이 작성)

마찬가지로 변수선언은 사용하는 위치와 최대한 가까이 둔다. (예외로 멤버변수는 최상단에 놓는게 관습)

적절한 행구분은 필수(새로운 개념/논리는 행구분을 하여 끊어주자).

팀 내 형식 규칙을 따를 것

 

5. 객체와 자료구조

객체는 자료(멤버변수)를 숨기고(private) 함수는 공개(public)한다. (캡슐화)

자료구조는 자료는 공개하고 함수는 숨긴다.

 

6. 오류 처리

오류코드 정의 및 리턴보단 try catch 문을 사용하라

null을 주고받지 말라 (nullpointerexception 방지 및 불필요한 null 체크 생략이 가능)

 

7. 경계

학습테스트(외부라이브러리(ex: log4j, aspectj 등)의 충분한 연습과 학습)의 중요성

Adapter 패턴(캡슐화)을 사용하여 외부라이브러리가 직접적으로 사용되지 않도록 하자

 

8. 단위테스트

1) 실패 케이스 부터 작성

2) 실패를 통과하는 실제 코드 작성

테스트는 한번에 1개의 개념만 테스트

assert 문도 가급적 한개만 사용하도록 테스트코드 작성

 

9. 클래스

1) SRP : single responsibility principal/단일 책임원칙 

클래스는 한 가지 기능(역할)만 해야 한다.

2) 응집도(Cohesion)가 커야 좋다

인스턴스 변수를 여러 메소드에서 사용해야 응집도가 높다 할 수 있다.

인스턴스 변수가 많다면? 클래스가 분리되어야 한다는 의미(클래스는 작을 수록 좋다)

3) OCP : open closed principle

확장에 개방적이고 수정에 폐쇄적이어야 한다

 

10. 동시성(멀티스레드)

[방어전략]

1) 동시성코드는 타 코드와 분리 (SRP)

2) 임계영역을 최소화(동기화 하는 부분을 최대한 작게)

3) 사본 사용(객체 복사)

4) 테스트

4-1) 단일 스레드에서 먼저 확인 후 멀티 스레드 작성

4-2) 보조코드(wait(), sleep(), yield() 등) 사용하여 테스트/AOF(aspect oriented framework), cglib 등과 같은 멀티스레드 테스트 도구 사용

4-3) 다양한 os에서 테스트

4-4) 프로세서 수보다 많은 스레드 테스트 (스와핑시 문제발생하는 경우가 존재)

* 스와핑 : 프로세스의 cpu 할당 시간이 끝나면, 메모리를 보조 기억장치(하드디스크)로 내보내고 다른 프로세스 메모리 불러 들이는 것

 

 

2019.12.28

 

반응형

'etc. > books' 카테고리의 다른 글

[Book] HTTP 완벽 가이드  (0) 2020.03.17
[Book] 객체지향의 사실과 오해  (0) 2020.02.23
[Book] 소프트웨어 장인  (0) 2020.01.16
[Book] 프로그래머의 길, 멘토에게 묻다  (0) 2019.11.22
[Book] Head First : Design Patterns  (2) 2019.06.04

개발자로 진로를 틀게 된 후, 처음으로 읽은 자기계발서.

읽은지 2년이 다 되어가는 책.

개발자로 살아온 지난 2.5년을 돌아볼겸, TRUE 개발자의 자세로 다시금 정신무장 할 겸 정리해본다.

 

부숴도 괜찮은 장난감
장난감 프로젝트를 만들어 보아라

흰띠를 매라
새로운 것을 습득할 땐 기존의 것을 내려놓자
머리를 비워야 채울 수 있다

열정을 드러내라
팀에 맞추기 위해 개발에 대한 흥분과 열정을 숨기지 말라
팀에 열정을 불어넣고 모든 것에 질문하라
팀이 열정을 받아주지 못한다면 열정을 키울 다른 방법을 찾아라.

무지를 드러내라
다른 사람들이 내가 잘 모른다고 생각하는 것을 두려워 말라. 모르는 것을 질문하라

무지에 맞서라
빈틈을 능동적으로 메우자
무지함을 인지하면서도 그에 맞서지 않는 부류("잘은 모르지만 이렇게 하면 되잖아?")에 속하지 말자

깊은 쪽
어려운 문제가 주어진다면 그 기회를 잡아라
두려운 일을 맡고 해결을 하면서 성장 할 수 있다.
실패한다 해도 그 실패 속에서 경험치가 쌓인다

한 발 물러서라
너무나 부족한 나 자신을 발견하면, 압도됨을 느낄 때가 있다.
이 땐 익숙한 능력으로 돌아가라.
익숙한 코드를 짜며 힐링하라.

비교적 잘 해온 것들 : 한 발 물러서라, 깊은 쪽, 무지를 드러내라, 무지에 맞서라, 열정을 드러내라

비교적 잘 못 해온 것들 : 부숴도 괜찮은 장난감, 흰띠를 매라

 

Spring Boot + JPA 위에서 동작하는 게시판(TDD 개발) 형태의 부숴도 괜찮은 장난감부터 만들어봐야지

 

반응형

'etc. > books' 카테고리의 다른 글

[Book] HTTP 완벽 가이드  (0) 2020.03.17
[Book] 객체지향의 사실과 오해  (0) 2020.02.23
[Book] 소프트웨어 장인  (0) 2020.01.16
[Book] Clean Code (클린 코드)  (0) 2019.12.28
[Book] Head First : Design Patterns  (2) 2019.06.04

[이직/면접 관련]

https://perfectacle.github.io/2019/08/23/exit-yanolja-feat-leisureq/#more

 

https://zorba91.tistory.com/270?category=876991

 

http://blog.naver.com/PostView.nhn?blogId=gngh0101&logNo=221296037812&parentCategoryNo=&categoryNo=38&viewDate=&isShowPopularPosts=true&from=search

 

채용공고: https://github.com/jojoldu/junior-recruit-scheduler

 

[면접질문 모음]

https://github.com/wayhome25/Interview_Question_for_Beginner

 

[개발관련]

back 개념정리가 잘 되어 있는 곳 : https://mangkyu.tistory.com/category

front 언어 정리가 매우 잘되어있는 곳 : https://poiemaweb.com/

탈휴먼 조대협님 블로그 : https://bcho.tistory.com/

전공 지식 정리가 잘 되어 있는 곳 : https://wayhome25.github.io/cs/2017/04/20/cs-26-bigO/

github 관련 설명 : https://milooy.wordpress.com/2017/06/21/working-together-with-github-tutorial/

클로저 간단하고 쉬운 설명 : https://yuja-kong.tistory.com/68?category=801961

반응형

 

1. 참조객체 복사시 주의.

list , array 와 같은 참조객체 복사시 주소값만 복사하는 얕은복사 주의.

참고 : https://developyo.tistory.com/59?category=688588

 

2. Transaction 사용시 주의. 

1) @Transactional 어노테이션이 붙은 A method 가 동일한 클래스 내에 위치한 메소드 B에 의해 호출될 때, A의 트랜잭션 어노테이션은 작동하지 않음.

2) 스프링의 Transaction은 checked exception 은 rollback 대상으로 보지않음.

참고 : https://developyo.tistory.com/51

 

3. overloading 관련

오버로딩은 상속이 되지 않음.

참고 : https://stackoverflow.com/questions/31141834/overloading-method-on-extended-class

 

오버로딩은 컴파일 단계에서.

오버라이딩은 런타임 단계에서.

참고 : http://blog.naver.com/PostView.nhn?blogId=skykingkjs&logNo=150175869201&redirect=Dlog&widgetTypeCall=true

 

4. @value 주입시 주의사항

@Value 필드 주입의 경우 Object 가 생성되고 난 후 주입되므로 

Object 생성자를 타는 시점에선 @Value 값이 null.

@Value 로 주입받은 값을 생성자에서 사용시 @PostConstruct 사용 할 것

참고 : https://stackoverflow.com/questions/46035971/spring-autowired-and-value-on-property-not-working

참고 : https://jeong-pro.tistory.com/167

 

[@PostConstruct 사용법]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
@Component("CustomChatManager")
public class CustomChatManager {
    
    protected final static Logger logger = LoggerFactory.getLogger(CustomChatManager.class);
        
    @Value("#{systemProperties['jboss.service.mode']}")    
    private String CHATJAR;    
 
    private ChatManager cm;
    
    private static final String CHAT_SERVER_LOCAL = "http://1";    //로컬
    private static final String CHAT_SERVER_DEV = "http://2";    //개발 
    private static final String CHAT_SERVER_DEV2 = "http://3";    
    private static final String CHAT_SERVER_OPER = "http://4";    
    
    @PostConstruct    
    public void init() throws Exception{
        this.cm = ChatManager.getInstance();
        this.setServerURI();
    }    
    //채팅서버 URI 세팅
    private void setServerURI() throws Exception {
        
        String uri = CHAT_SERVER_LOCAL;
        
        if(CHATJAR != null) {
            switch(CHATJAR) {
            case "local":
                uri = CHAT_SERVER_LOCAL;
                break;
            case "dev":
                uri = CHAT_SERVER_DEV;
                break;
            case "tb":
            case "bmt":
                uri = CHAT_SERVER_DEV2;
                break;
            case "oper"
                uri = CHAT_SERVER_OPER;
                break;
            default :
                uri = CHAT_SERVER_OPER;
                break;
            }
        }
        
        URI suri = null;
        logger.info("chatjar : " + CHATJAR + "\nchat uri : " + uri);
        
        try {
            suri = new URI(uri);
            cm.setServerURI(suri);
        } catch (URISyntaxException ue) {
            logger.error("set chat jar failed ! : {}" , ue);
            throw ue;
        } catch (Exception e) {
            logger.error("set chat jar failed ! : {}" , e);
            throw e;
        }
    }
    
    public ChatManager getInstance() throws Exception {
        return this.cm;
    }
}
 
cs

 

5. 스프링+멀티스레드 환경에서 멤버변수 선언 주의

Thread safe 하다는 건 public 메소드 안의 로컬 변수가 Thread safe 하다는 의미일 뿐, 멤버변수가 Thread safe 하다는 의미가 아니다.

멤버변수는 주입에 사용되는 Bean 만 사용할 것

참고 : https://beyondj2ee.wordpress.com/2013/02/28/%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B9%88-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD/

 

6. DI 와 new 생성자의 혼용 주의

new 생성자로 A 객체 생성, A 객체 내에서 특정 객체 DI 로 주입받는 경우

DI 에서 null pointer exception 발생.

 

7. Interceptor 내의 멤버변수 사용시 주의

Interceptor 내의 prehandle , posthandle 메소드 내에서 class(Interceptor)의 멤버변수(전역변수)를 사용하여 처리경과시간을 찍을 경우 시간 맞지않음. (prehandle 에서 time set 한 후, posthandle 에서 time get 할 경우 엉터리 시간이 나옴)

context 흐름을 따르므로 prehandle --> ~ --> posthandle 간 흐름에서 parameter 로 들고 다녀야 함

 

8. Interceptor 에서 body 값 출력 주의

Interceptor 에서 body 에 담겨온 클라이언트의 request parameter 를 찍는 경우

실제 요청을 받아 로직을 수행하는 controller 나 service 에서 request parameter를 꺼내 쓸 수 없음.

stream은 1회성이므로 한번 열리면 다시 열어 쓸 수 없음.

--> 위 경우 filter 로 request parameter를 wrapping 하거나, 아예 AOP 로 로그를 찍어야 함.

 

9. DELETE 방식 호출시 주의사항

outputStream 사용하지 말것. 사용시 에러남.

참고 : https://developyo.tistory.com/8?category=688588

 

10. 이너클래스 사용시 주의사항

이너클래스는 바깥쪽에 있는 변수 중, final 로 선언된 변수만 사용이 가능.

 

11. 파일 업로드/다운로드 시 directory 권한 주의

파일을 로컬의 특정 경로 밑에 생성하여 특정 외부 서버에 ftp 로 전송하는 배치가 있을 때,

로컬의 특정 경로에 권한이 어떻게 되어있는지 필히 확인할 것.

만약 로컬의 특정 경로가 root 755 와 같이 되어있어, was계정이 w 가 불가 할 경우 에러발생.

 

12. mybatis version 낮은 경우 update 쿼리에서 selectkey 사용 불가

 

13. git hub repository 연동시 DB 정보를 비롯해 숨겨야 할 정보 유의하여 연동하기

gitignore 작성한 후 repository 연동해야 기록 자체가 남질 않음.

 

 

반응형

카카오톡 이름 알아내는 법(실명 알아내기)

 

위와 같이 자신의 이름 대신 이모티콘/이모지나 기타 문구를 사용하고 있는 사용자의 실명을 알아내보자.

 

 

이름을 알아내고자 하는 사용자와 1:1채팅 방을 만든 후, 송금 버튼을 눌러준다.

 

 

카카오 송금 화면에 진입하면 위처럼 실명을 알아낼 수 있다.

※카카오계좌를 한 번 이라도 사용한 사용자인 경우에만 위 방법으로 알아낼 수 있다

 

 

 

반응형

'etc. > etc.' 카테고리의 다른 글

개발자에게 유용한 툴 정리  (0) 2020.01.14
좋은 블로그/글 모음  (0) 2019.11.11
Image to ASCII : 이미지를 문자로 변환하기  (0) 2019.09.20
Maven error (Missing artifact error)  (2) 2019.09.04
윈도우 정품 마크 숨기기  (0) 2019.08.29

Image to ASCII : 이미지를 문자로 변환하기

 

제공사이트 : https://www.text-image.com/convert/ascii.html

 

TEXT-IMAGE.com :: Convert

  Convert into ASCII For help on using the converter, see the help page. For the HTML converter, click here.

www.text-image.com

[사용법]

1. 사이트 방문하여 상단 HTML/ASCII/MATRIX 중 원하는 문자 형태 선택

2. 파일 선택 및 옵션 지정 후 Convert! 클릭시 변환된 결과물이 나온다.

 

 

[사용 예]

위의 구글 이미지를 아래와 같이 문자로 변형 가능.

 

1) HTML

 

2) ASCII

3)Matrix

 

 

개발자들의 경우 IDE 콘솔 로그 혹은 was 서버 로그등에 활용이 가능하다.

 

 

반응형

2019. 9. 2    : 시작

2019. 11. 21 : 아직 꿈에서 담배를 핀다.

반응형

'etc. > life' 카테고리의 다른 글

한 달간 방학 : 이직과 결혼  (2) 2020.06.11

Maven error (Missing artifact error)

pom.xml 내의 dependency 설정이 잘못되었거나 repository 로 부터 dependency jar 들을 가져오지 못하는 경우 발생하는 에러.

 

pom.xml 에 딱히 이상이 없고 project clean 을 해봐도 해당 에러가 해결되지 않는다면,

Update maven 에서 Snapshots/Releases 강제 업데이트 옵션을 체크 후 maven update.

 

참고 : https://examples.javacodegeeks.com/enterprise-java/maven/maven-resolve-missing-artifact-error-example/

반응형

+ Recent posts