출처: http://www.slideshare.net/sunhyouplee/c-33426459

C++ 코드 품질 관리 비법

(C++기준 이나 모든 코드에 통용된다고 생각됨)


괄호는 개인적 리뷰이다.

Legible

 - 보기 좋은 코드

(좋은 설계가 좋은 코드를 만든다.)

 - 템플릿을 준수하고 도구를 사용하자 

(Google Code Template, PMD 등)

Flexible

 - 유연한 코드

(설계구조 파악, 코드 사용 패턴 파악)

Testable

 - 테스트하기 쉬운 코드

(TDD(Test Driven Development) 기반으로 제작하면 좋지만 적어도 테스트 코드는 작성하며 진행하자.)

Economic

 - 컴퓨터 자원을 아끼자

(무분별한 for문, 재귀문, 닫지않은 Stream 등 GC가 지원하지 않는 자원반환. 특히 재귀함수는 조심에 조심을 기울이자. 무한루프에 잘 빠진다.)

Compliant

 - 다양한 의미가 있으나 의견 일치 정도로..

(기능 구현 시 코드에 푹 빠지게 되면 완성품이 나왔을때 엉뚱한 결과물에 의문에 빠지는 수가 생긴다. 끊임없이 의견을 나누어 상대방의 생각과 내 생각을 동기화(Sync) 하자.)

'java' 카테고리의 다른 글

Java7 의 신기능 정리  (0) 2014.07.01
Java 7 try catch 문법. autocloseable  (0) 2014.06.20
Java Apn 샘플코드  (0) 2014.04.14
if 비교 연산자 우선순위  (0) 2014.04.01
abstract 와 interface 차이  (0) 2014.03.26

Javapns를 사용한 apn 샘플코드

1. deviceToken을 하나씩 활용했는데 list로 활용하는게 좀더 실용적이다.

2. advanced payload를 활용함. 기존 Push 보다 좀더 기능성이 좋다. 

3. 전송 실패시 exception이 잡히지 않는다. 별도로 처리가 필요함.


@Service

@Scope("singleton")

public class ApnConnector {

    @Value("${apn.cert.path}") //인증서 경로

    private String apnCertPath;

    @Value("${apn.cert.password}") //인증서 패스워드

    private String apnCertPassword;


    private Logger logger = LoggerFactory.getLogger(getClass());


    public boolean sendMessage(String deviceToken, String locKey, List<String> args, String customMessage) throws Exception {

        try {

            PushNotificationPayload adPayload = PushNotificationPayload.complex();

            adPayload.addCustomAlertLocKey(locKey);

            adPayload.addCustomAlertLocArgs(args);

            adPayload.addCustomDictionary("msg", customMessage);

            PushedNotifications noti = Push.payload(adPayload, apnCertPath, apnCertPassword, false, new String[] {deviceToken});

            logger.debug("sendMessage success : " + noti.getSuccessfulNotifications().size());

            logger.debug("sendMessage fail : " + noti.getFailedNotifications().size());

        } catch (CommunicationException | KeystoreException e) {

            logger.error("sendMessage faild. :" + e.getMessage());

            throw new Exception();

        } catch (Exception e) {

            logger.error("sendMessage faild. :" + e.getMessage());

            throw new Exception();

        }

        return true;

    }


}



'java' 카테고리의 다른 글

Java 7 try catch 문법. autocloseable  (0) 2014.06.20
코드 품질 관리  (0) 2014.04.17
if 비교 연산자 우선순위  (0) 2014.04.01
abstract 와 interface 차이  (0) 2014.03.26
객체를 인자로 보내서 값을 설정하는것  (0) 2014.03.18

비교연산자는 앞문항의 값을 비교 후 다음문항을 검사한다.

str == null 검사가 뒤에 있을경우 equals 검사를 우선수행하게 되어 NullPointException이 발생하게 된다.


ex)

private void check(String str) {

  if(str == null || str.equals("check") { 

  //if("check".equals(str)) // 이렇게 써주는게 더 효과적이다. 

    throw new Exception();

  } else {

    return;

  }

}



'java' 카테고리의 다른 글

코드 품질 관리  (0) 2014.04.17
Java Apn 샘플코드  (0) 2014.04.14
abstract 와 interface 차이  (0) 2014.03.26
객체를 인자로 보내서 값을 설정하는것  (0) 2014.03.18
Java GCM 샘플 코드  (0) 2014.03.17

공통점은 둘다 파생 클래스의 생산을 위하기 위해 만들어졌다.


abstract 

 -  body 를 구현해야한다.

 - body를 선언하지 않기 위해서는 앞에 abstract 키워드를 붙여야한다.

 - 변수를 미리 선언 가능하다.


interface

 - body를 구현할 필요가 없다. (메소드명, 인자리스트, 반환타입)

 - 변수를 선언하게 될 경우 static final으로 선언이 된다. 

'java' 카테고리의 다른 글

Java Apn 샘플코드  (0) 2014.04.14
if 비교 연산자 우선순위  (0) 2014.04.01
객체를 인자로 보내서 값을 설정하는것  (0) 2014.03.18
Java GCM 샘플 코드  (0) 2014.03.17
jaxb sample code  (0) 2014.03.17

간단한 메모

객체를 인자로 보내서 값을 설정하는것을 앨리어싱(aliasing) 이라고 한다.

용어를 잘 몰랐는데 알아가는 재미가 있네


ex.

public void setUserInfo(User user) {

   user.setName("홍길동");

   user.setAge("30");

   user.setSex("Male");

}

'java' 카테고리의 다른 글

if 비교 연산자 우선순위  (0) 2014.04.01
abstract 와 interface 차이  (0) 2014.03.26
Java GCM 샘플 코드  (0) 2014.03.17
jaxb sample code  (0) 2014.03.17
GCM MismatchSenderId  (0) 2014.03.12

Spring Rest Template 를 활용한 GCM 커넥터 샘플 코드

코드 포인트

 1. Interface부를 따로 분리하지 않음.

 2. RestTemplate 를 활용

 3. GCM 전송


@Component

@Scope("singleton")

public class GcmConnector {


    private Logger logger = LoggerFactory.getLogger(getClass());


    @Value("${google.gcm.url}")

    private String googleGcmUrl;

    @Value("${google.gcm.authToken}")

    private String googleGcmAuthToken;


    public boolean sendMessage(String registrationId, String message) throws Exception {

        StringBuffer postDataBuilder = new StringBuffer();

        postDataBuilder.append("registration_id=" + registrationId); // 등록ID 

        postDataBuilder.append("&collapse_key=1");

        postDataBuilder.append("&delay_while_idle=1");

        try {

            postDataBuilder.append("&data.msg=" + URLEncoder.encode(message, "UTF-8")); //msg


            UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(googleGcmUrl);


            HttpHeaders httpHeaders = new HttpHeaders();

            httpHeaders.add(org.apache.http.HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded;charset=UTF-8");

            httpHeaders.add(org.apache.http.HttpHeaders.CONTENT_LENGTH, String.valueOf(postDataBuilder.length()));

            httpHeaders.add(org.apache.http.HttpHeaders.AUTHORIZATION, "key=" + googleGcmAuthToken);

            HttpEntity<String> httpEntity = new HttpEntity<String>(postDataBuilder.toString(), httpHeaders);


            new RestTemplate().exchange(uriComponentsBuilder.build().toUri(), HttpMethod.POST, httpEntity, String.class);

            return true;

        } catch (UnsupportedEncodingException e) {

            logger.error("GcmPushConnectorImpl pushRestTemplate faild. cause : " + e.getMessage());

        } catch (HttpClientErrorException e) {

            logger.error("GcmPushConnectorImpl pushRestTemplate faild. cause : " + e.getMessage());

        }

    }

}



'java' 카테고리의 다른 글

abstract 와 interface 차이  (0) 2014.03.26
객체를 인자로 보내서 값을 설정하는것  (0) 2014.03.18
jaxb sample code  (0) 2014.03.17
GCM MismatchSenderId  (0) 2014.03.12
xmpp sasl authentication digest-md5 failed not-authorized  (0) 2014.03.04

    private String convertObjectToXmlStr(Object object) throws Exception {

        StringWriter stringWriter = new StringWriter();

        JAXBContext jaxbContextRequest;

        try {

            jaxbContextRequest = JAXBContext.newInstance(object.getClass());

            Marshaller jaxbMarshaller = jaxbContextRequest.createMarshaller();

            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            jaxbMarshaller.marshal(object, stringWriter);

            String xml = stringWriter.toString();

            return xml;

        } catch (JAXBException e) {

            logger.error("convertObjectToXmlStr faild. cause : " + e.getMessage());


        }

    }


GCM 메시징 구현 중 안드로이드 개발자가 바뀌었다.


서버에 올릴 키를 다르게 지정한다고 지정했더니 계속 401 에러가 나길래 curl로 테스트 해봤더니..


<GCM 테스트 쉘스크립트 - 출처 : 스택 오버플로우>

api_key=$1

reg_id=$2

echo "api_key= $1"

echo "reg_id= $2"


curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send  -d "{\"registration_ids\":[\"$reg_id\"],\"data\":{\"code\":123}}"

echo

<<>>

MismatchSenderId 가 나는것이다.

안드로이드 쪽에 확인해보니 안드로이드 소스 중에 이런게 있었다.


GCMRegistrar.register(this, SENDER_ID);


즉 RegistraionId를 획득하는건데 SENDER_ID가 이전 담당자 프로젝트의 sender id로 고정되어 있었던 것이다.


얼른 수정 부탁하고 테스트 하니 성공..


교훈은 이해가 부족한채로 사용하면 피본다.. 이틀동안 401만 주구장창 검색했네..

XMPP 서버 구축 후 연결 클라이언트를 생성하여 로그인중에 위와 같은 에러가 발생했다.


원인을 알수없어 헤멨는데 의외의 곳에 복병이 있었다.


userId를 이메일 형식을 사용하면 제목과 같은 에러가 발생한다.


검색해도 잘 나오지 않으니 기억해두자.

'java' 카테고리의 다른 글

jaxb sample code  (0) 2014.03.17
GCM MismatchSenderId  (0) 2014.03.12
자바 정규표현식 필터링 Pattern 사용법 예시  (0) 2014.02.04
TreeSet 을 사용한 List<> 중복 제거  (0) 2014.01.06
죽은 코드 저장  (0) 2013.12.12

찾아봐도 잘 안나와서 예제소스를 작성하여 메모해놓음.


public void checkRegularCharactor(String path, String method) throws Exception {

        String invalidString = "|\\|:|\"|\\*|\\?|<|>|#";

        Pattern pattern = Pattern.compile(invalidString);

        if(pattern.matcher(path).find()) {

            logger.error(method + "faild. checkRegularCharactor failed. : " + resultPath);

        }

    }


path에 invalid string이 포함되어 있으면 exception 처리.


invalidString을 저렇게 썼을때 실제로 필터링 되는 문자는

\ : " * ? < > # 

이다. 메일이나 다른 경우에는 좀더 상세히 할 필요가 있겠다.

'java' 카테고리의 다른 글

GCM MismatchSenderId  (0) 2014.03.12
xmpp sasl authentication digest-md5 failed not-authorized  (0) 2014.03.04
TreeSet 을 사용한 List<> 중복 제거  (0) 2014.01.06
죽은 코드 저장  (0) 2013.12.12
InputStream을 파일로 저장  (0) 2013.11.01

+ Recent posts