SW개발자로서 적성에 맞는지? 혹은 괜찮은 개발자인지 판단에 도움이 될만한 내용을 생각날때마다 정리하는 글입니다.

 - 주의: 해당 내용은 업계 선배분들이 얘기한 것도 있지만, 제 주관적인 생각도 있기 때문에 다른 분들과 생각이 다를 수 있습니다.

 

  1. 평생 학습할 수 있어야 합니다.
    1. 기술 발전이 빠른 업종이고, 새로운 기술로 어려운 문제를 쉽게 풀 수 있기 때문입니다.
      1. 처음 HDFS(하둡)를 봤을때 놀랐죠. 그전에는 1대의 머신에서만 어떻게든 문제 해결해야한다는 생각이 강했는데 여러 컴퓨팅파워를 이용해서 big data처리라니.. 어떻게든 오라클 SP 최적화하고 있었는데.. 요즘 elastic search의 클러스터도 그렇고요
  2. 팀플레이를 할 수 있어야합니다.
    1. 요즘에는 혼자 개발해서 서비스하기에는 SW규모가 너무 커졌습니다. 팀으로 서비스를 만들어야하는데 팀플레이가 안되면 곤란하죠.
  3. 끊기 있게 엔지니어링 문제를 열심히 풀 수 있어야합니다.
  1. MIT라이센스(수정, 배포가 자유로움)의 bootstrap admin 템플릿
    1. toy프로젝트 등을 개발할때 사용
    2. https://github.com/ColorlibHQ/AdminLTE
  2. 업무용으로는 돈주고 구매한 inspinia를 보통 사용
    1. Extended 버전이 100불정도였던것 같은데 현재 1400불(엄청 올랐네요. 개인적으로도 하나 구매해두려다가 안했는데 후회가..)
    2. https://wrapbootstrap.com/theme/inspinia-responsive-admin-template-WB0R5L90S

 

참고

 - 이메일을 주 커뮤니케이션 방법으로 사용하는 회사에서 근무시, 새로 입사하는 직원들에게 조언해주는 내용입니다.

 

1. 이메일은 두괄식으로 작성
2. 수신자가 많을시 To(받는사람)를 정확하게 명시
3. 이메일로 요청받은 업무가 시간이 걸린다면, 우선 선 회신을 진행(언제까지 확인 후 추가 회신한다는 형태로)
 - 발송자는 수신자가 업무를 F/U 한다는 내용을 인지시킴
4. 이메일 자동분류, 강조처리 기능 등을 사용해서 중요 이메일을 놓치지 않도록 함
 - 모바일 앱의 알림 설정도 진행
5. 읽지 않은 메일 숫자가 과하게 존재하면 안됨(모든 이메일은 확인 및 처리가 필요, 특히 본인이 수신자인 경우) 

 

기타 참고 : https://pathmaker.tistory.com/182

 

간단한 Testcase로 확인용 작성

	@Test
	void 두글자국가코드_및_국가명_리스트조회() {

		String[] countries = Locale.getISOCountries();
		//Arrays.stream(countries).forEach(System.out::println); //2글자 국가코드 리스트 확인

		for (String country : countries) {

			Locale l = new Locale("en", country);
			System.out.println(String.format("2글자 국가코드(ISO 3166-1 alpha-2): %s | 영문 국가명: %s | 한글 국가명: %s ", country, l.getDisplayCountry(new Locale("en")),
				l.getDisplayCountry(new Locale("ko"))));

		}

		System.out.println("countries 갯수: " + countries.length);

		Assertions.assertNotNull(countries);
		Assertions.assertTrue(countries.length >= 200); //2021년기준 249개국이 존재.(200개 국가 이상을 assert 체크 기준으로 함)
	}

메모

 

대표적인 기업용 블록체인 플랫폼
https://www.hyperledger.org/use/fabric

참고

 - site map 설명 링크

 

 

코드

 - 참고 링크

@RestController
public class TestController {

    @Autowired
    private RequestMappingHandlerMapping re;

    @GetMapping("/sitemap.xml")
    public String getSitemap() {
        Map<RequestMappingInfo, HandlerMethod> handlerMethods = re.getHandlerMethods();
        List<String> urls = new ArrayList<>();
        for (Entry<RequestMappingInfo, HandlerMethod> entry : handlerMethods.entrySet()) {
            urls.addAll((entry.getKey().getPatternsCondition().getPatterns()));
        }
        // Construct XML response from urls and return it
    }

}

메모 목적의 글로써 생략되는 내용이 많이 있을 수 있는점을 감안해주세요

(우아콘 2020참고)

 

  1. querydsl exist 사용 금지
    1. 기본
      1. sql의 exist는 조건을 만족하는 1번째 row를 만나면 쿼리가 바로 종료
      2. count의 경우는 모든 row를 scan해야하기 때문에 성능이 exist보다 안 좋음
    2. qeurydsl의 exist는 count 쿼리를 이용해서 수행되기 때문에 성능이 안 좋음
    3. 직접 구현
      1. limit 1을 추가함(예전에 mysql 생쿼리로 개발할때도 이렇게 했었음..)
        1. 다만, 조회결과가 없으면 0이 아니라 null을 반환하니 null 체크처리 주의
  2. cross join 회피
    1. 나올수 있는 모든 경우의 수를 대상으로 하기때문에 성능이 안좋은 cross join. 피하는게 좋음
    2. querydsl은 묵시적 join사용할때 cross join발생할 수 있음
    3. 명시적 join으로 회피
      1. 예) innerJoin 메소드로 명시적 처리
  3. Entity 보다는 DTO를 우선 사용
    1. entity 조회시
      1. 실시간으로 Entity 변경이 필요한 경우에는 장점 -> 다만 회사 프로덕션 환경에서 이럴일은 없음
      2. hibernate 캐시 불필요
      3. 불필요한 컬럼 조회
      4. OneToOne N+1  쿼리 등
      5. 단순 조회 기능에서는 성능 이슈 요소가 많음
    2. DTO 조회시
      1. 고강도 성능 개선, 대량의 데이터 조회가 필요한 경우
      2. 조회 컬럼 최소화하기
        1. as 표현식으로 대체하면 DB에실행되는쿼리에서 as컬럼은 제외됨
          1. 예) Expressions.asNumber(bookNo).as("bookNo")
      3. Select 컬럼에 Entity 자제
        1. 불필요 신규 Entity의 모든 컬럼이 조회될 수 있음
        2. OntToOne 관계에 대해서 매건마다 조회됨(N+1무조건 발생하게 됨)
  4. Group by 최적화
    1. mysql에서는 order by null 을 이용하면 file sort가 발생하지 않는 기능이 존재(개인적으로도 많이 사용)
    2. querydsl에서는 order by null을 지원하지 않기 때문에 직접 구현해서 사용
      1. 정렬이 필요하더라도 조회결과가 100건 이하라면 어플리케이션에서 정렬하는걸 고려(페이징이 아닐때만)
        1. was는 scale out이 가능하지만 DB는 어려움
  5. 커버링 인덱스 사용
    1. 개인적으로도 대용량 게시판 서비스의 페이징 개념 만들대 사용함
    2. jpql은 from절의 서브쿼리를 지원하지 않기 때문에 우회처리가 필요
      1. 쿼리를 2개로 나눠서 실행
        1. Cluster Key(PK와 같은)를 커버링 인덱스로 빠르게 조회하고
        2. 조회된 Key로 select쿼리를 in 쿼리로 실행
  6. update 최적화
    1. 무분별한 DirtyChecking을 꼭 확인해야함
      1. 실시간 비지니스 처리, 실시간 단건 처리시
        1. 하이버네이트 캐시는 일괄 업데이트시 캐시 갱신이 안되기때문에
      2. Querydsl.update
        1. 대량의 데이터를 일괄로 Update 처리시
  7. bulk insert
    1. JPA에서는 auto_increment일때는 insert합치기가 적용되지 않는 문제가 있음
    2. jdbcTemplate롤 bulk insert는 처리 가능하나, 컴파일 체크, Type-safe 개발이 어려움
      1. 문자열로 쿼리를 작성해야해서
    3. 따로 개발해서 진행할수도 있지만... 개인적으로 고민좀 되는 부분이 있음
  1. 브랜치 생성

 

local에서 remote 브랜치로부터 신규 브랜치를 생성

 

 

 

remote에 test-1 브랜치 생성됨을 확인 가능

 

 

 

  1. test-1 브랜치를 master로 merge하기

intelliJ 에서 Git-> Merge 메뉴
master에 test-1 브랜치를 Merge 실행
이후 remote에 푸시하면 test-1에서 작업한 내용이 머지되어 remote까지 반영되었음을 확인 가능

 

 

 

+ Recent posts