분명 클래스 별로 main 메서드를 실행했기에 앞에서 문제가 없었고,

전혀 상관이 없는 클래스를 돌리는데 문제가 생겼다.

추측컨대 동일한 클래스이름 동일한 클래스파일들이 테스트한다고

여기저기 패키지안에 담아 두어서 그런지 오류가 생긴듯 했다.. 

 

에러는 다음과 같다.

-Duplicate key /패키지/클래스이름.java

-디테일하게 확인해보니 " Build cache is disabled "

-compile 에러가 출력이 되었다.

 

해결순서

1. 관련된 클래스를 모두 지워 주었다.

2. 컴파일된 .클래스 파일을 모두 삭제 했다.

3. https://jobc.tistory.com/207 여기에 나온대로 IntelliJ Cache를 삭제를 해보았으나 실패

4. https://www.inflearn.com/questions/171043 누군가가 인프런에 질문 올린 내용을 참고했다..

   재부팅후에 build내에 있는 파일을 모두 삭제하라고 답변을 달았고,

   build 파일 안에 찾아 보니 source-classes-mapping 파일이 보였다.

   열어보니 앞에서 삭제했었던 관련된 클래스들이 안에 있었고 그 관련된 클래스를 삭제해주었다.

5. 다시 돌리니 제대로 오류없이 돌아간다.

 

트러블슈팅하느라 너무 시간이 오래 걸렸다.. 해결되어서 다행이지만, 다음 공부내용을 더 공부하지 못해 속상하다..

자바에서 작성한 코드가 컴파일되어 실행되기까지의 과정을 피상적으로만 알고 있어
실제로 main메서드가 실행되는 과정을 알고 싶어 정리해봅니다.

main() 메서드
- 프로그램이 실행되는 시작점

 

main()메서드가 실행되기전에 JRE와 JVM에서 일어나는 일들

1. JRE(Java RunTime Environment)
-프로그램에 main() 메서드가 있는지 확인한다.
-main() 메서드가 있는지 확인이 되면, 프로그램 실행을 위해 JVM에 전원을 넣어 부팅한다.

2. JVM이 목적파일을 실행하기 위해 하는 과정
-java.lang패키지를 T메모리의 스태틱 영역에 배치
-import된 패키지를 T메모리의 스태틱 영역에 배치
-작성된 모든 클래스를 T메모리의 스태틱 영역에 배치
* JVM 하는일
-목적파일을 받아 목적파일을 실행한다.

3. 스택영역 및 args인자를 저장할 변수공간 스택 프레임
-여는중괄호(main메서드의 "(")가 있을시에 하나씩 생성됨 T메모리에 스택프레임 스택영역 할당
-main메서드의 인자 args를 저장할 변수공간 스택 프레임의 밑에 생성
-그리고 main메서드의 첫 명령문 실행

4. main메서드 실행이 종료되면
-JRE는 JVM을 종료, JRE자체도 OS상의 메모리에서 사라지고, T메모리도 생명주기가 끝남.

데이터를 불러오기 위한 API개발이 많았다.

 

당연한 것이지만,

API개발시 고려해야 할 부분은 크게 2가지이었다.

 

1. 파라미터 값을 고려할 때에 지금 보내는 파라미터만으로도 원하는 데이터가 출력이 되는지를 고려

 

2. 화면흐름상 예를 들어 게시글 수정일 때에 가장 핵심이 되는 id(파라미터)외에 불필요한 파라미터가 있는지를 고려

 

사실 쿼리도 중요했지만, 이 파라미터를 던졌을 때 원하는 데이터 또는 값들이 나와야 하는 것이 핵심이었기에

기초적이지만 중요했던 고려사항 2가지이다..

같이 일하던 사수가 나에게 컨벤션에 가본적이 있냐고 질문을 했었다.

가본적이 있어야 업무에 도움이 되기 때문에 받은 질문이었다.

 

본인은 블록체인 컨벤션에 참석해본적이 있다.

그곳에 컨벤션이 있었고 컨퍼런스가 있었고 컨퍼런스마다 컨퍼런스명이 있었던 것 같다.

회사별로 부스 등등이 있었다.

 

자바 클래스 설계(추상화 모델링) 하듯이 테이블설계시에도 컨퍼런스에 대한 속성들을 파악해서 설계를 해야 했고

간단한 개념들 보다 실무에서 접근했던 것들을 논하고

그 외의 테이블들이 더 있지만 오늘은 컨퍼런스 테이블에 대해 얘기해보려고 한다.

 

설계시 유의해야 했던 것들

1) 기획서를 파악하기

2) 일반적인 컨퍼런스의 구조

3) 비대면으로 컨퍼런스가 진행됨을 기억해야 한다.

4) 컨퍼런스가 하나가 아닌 여러 컨퍼런스의 데이터가 쌓일 것을 염두에 두어야 한다.

5) 자료형을 넉넉히 하되 너무 넉넉히 설정하진 말자.

 

 

실제와 동일하게 하지 않고 정리형태로 작성한거라 테이블생성시 어떠한 형태로 작성했는지만 봐주었으면 한다.

 

컨퍼런스ID  varchar(20) NOT NULL (PK)

컨벤션ID  varchar(20) NOT NULL (FK)

컨퍼런스제목 varchar(50) NOT NULL,

컨퍼런스내용작성 varchar(100) NULL

판매자 ID varchar(20) NOT NULL

컨퍼런스이미지파일경로 varchar(200) DEFAULT NULL

등록일시 datetime DEFAULT current_timestamp()

수정일시 `UPDT_DT` datetime DEFAULT current_timestamp()

컨퍼런스 시작일 date NOT NULL

컨퍼런스 종료일 date NOT NULL

생방송, 녹화방송 varchar(20) NOT NULL

내부URL-컨퍼런스자료, 파일 업로드 varchar(100) NULL

외부URL-링크(유튜브) varchar(100) NULL

스트리밍 화질 선택 varchar(20) NULL

스트리밍 인원 수 선택 int(20) NULL

스트리밍 파일저장 여부 varchar(1) NOT NULL DEFAULT 'Y'

컨퍼런스 입장 요금 설정(감면 또는 비감면) varchar(20) NOT NULL

컨퍼런스저장여부(텍스트 채팅 포함) varchar(1) NOT NULL DEFAULT 'Y'

채팅지원여부(텍스트 채팅 포함(1:N)) varchar(1) NOT NULL DEFAULT 'Y'

컨퍼런스활성화여부 varchar(1) NOT NULL DEFAULT 'Y'

컨퍼런스강사 사진

컨퍼런스강사 이름

컨퍼런스강사 이력

 

 

여기에서 ERD설계에서 가장 중요한 것을 꼽으라면 단연코 컨퍼런스와 컨벤션 아이디이다.

컨벤션 아이디는 컨벤션과의 테이블을 외래키(FK)로 걸어주고

컨퍼런스 아이디는 추후 실제 바이어의 컨퍼런스 참석여부를 알려주는 테이블에 FK 연결시켜주어

데이터무결성을 높여주는 역할을 한다.

첫 프로젝트는 비대면 컨벤션을 개발하는 프로젝트.

개발환경은 스프링부트, MariaDB, Mybatis 이었다.

 

 

최고관리자, 관리자, 바이어, 셀러에 따라 다르게 데이터를 조회하는 부분이 있었고

공통으로 데이터를 조회하는 부분을 위해 적용한 동적쿼리가 주 업무이었다.

먼저 정적쿼리와 동적쿼리 간단하게 차이점 부터 보자.

 

정적쿼리(Static SQL)

-어떤 조건 또는 상황에도 변경되지 않으면 정적쿼리

 

동적쿼리(Dynamic SQL)

-특정 조건들이나 상황에 따라 변경되면 동적쿼리

 

검색해서 컨벤션 관련 데이터 가져오는 동적쿼리를 작성하는 2가지 방법 중에 후자로 적용했다.

무조건적일 때보다 flexible하기 때문에 선택적으로 데이터가 검색이 가능한 if문이 동반된 동적쿼리를 적용했다.

 

1. 무조건적으로 시작일 종료일에 해당되는 조건을 통해서 검색이 가능하도록 표기

 

<sql id="sql_select컨벤션">

               SELECT *

                 FROM 컨벤션테이블

                WHERE 컨벤션아이디 = #{컨벤션아이디}           

               AND 컨벤션시작일 BETWEEN {컨벤션시작일} AND {컨벤션종료일}

               --컨벤션 시작일 종료일 사이에 시작일만 가져오는 쿼리

               AND 컨벤션종료일 BETWEEN {컨벤션시작일} AND {컨벤션종료일}

               --컨벤션 시작일 종료일 사이에 종료일만 가져오는 쿼리

 

                ORDER BY 컨벤션등록일 DESC, 컨벤션업데이트일DESC

</sql>

 

 

2. 선택적으로 시작일 종료일에 해당되는 조건을 통해서 검색이 가능하도록 표기를 해주는 쿼리문

 

<sql id="sql_select컨벤션">

               SELECT *

                 FROM 컨벤션테이블

                WHERE 컨벤션아이디 = #{컨벤션아이디}

<if test="@패키지명@isNotEmpty(컨벤션아이디)">

               AND 컨벤션시작일 BETWEEN {컨벤션시작일} AND {컨벤션종료일}

</if>           

//선택적으로 컨벤션 시작일 및 종료일 사이에 시작일만 검색해서 가져오는 쿼리

`      

<if test="@패키지명@isNotEmpty(컨벤션아이디)">

                AND 컨벤션종료일 BETWEEN {컨벤션시작일} AND {컨벤션종료일}

</if>           

//선택적으로 컨벤션 시작일 및 종료일 사이에 종료일만 검색해서 가져오는 쿼리

 

                ORDER BY 컨벤션등록일DESC, 컨벤션업데이트일DESC

</sql>

팀장님에게 메모를 잘한다고 칭찬 받았다...

 

정말 기억을 잘하고 천재라면 모든 것을 기억하겠지만,

어느 순간 기억을 못하는 상황이 오고, 명확하게 전달을 하지 못하는 상황이 온다.

그때 다시 한번 서랍장에서 사진 꺼내듯이 내가 했던 업무내용들을 돌아보고

다시 한번 상기시키는 역할을 하기 때문에 업무를 했다면 히스토리나 했던 과정들을 기록을 한다.

 

그런 의미에서 그동안 정리해 두었던 글들을 하나씩 올리려 한다.

개발자는 공부를 해야 한다.

내가 천재개발자이거나 슈퍼 신입 개발자라면 공부를 게을리 하거나

아마도 개발 외에 것들을 했을 것 같다.

하지만, 그렇지 않은 이상 공부를 꾸준히 해야 하고 주니어 개발자는 무조건 열심히 해야 한다고 생각한다.

그리고 공부를 하되 하루에 1시간이라도 꾸준히 하는 것을 목표로 잡았다.

내가 해본 시도들은 다음과 같다.

 

1) 공부하기 위해 내가 시도한 수면시간(공부습관)

취침을 일찍하고 아침에 일어나서 공부를 시도했다.

새벽 5,6시에 일어나자마자 방에서 공부를 해보았고, 잠이 깨지 않는 것 같아서

회사에 일찍 출근해서 2시간씩 공부시도를 했다.

실질적으로 한달동안에 성공한 날은 손에 꼽는다.

 

공부를 해보았지만 아침에 공부를 하기에 습관이 안들여져서 그런가 1개월정도의 시도끝에

공부시간대가 맞지 않은 시간대임을 인정하고 저녁시간으로 바꾸어서 진행을 했다.

 

2) 온라인 강의(공부방법_1)

장점

온라인 강의의 장점은 일반 오프라인강의와는 달리 되감기가 가능해서

다시 강의를 들을 수 있고 나의 페이스에 맞추어서 공부가 가능하다.

 

단점

듣고 반복하고 메모하다 보면 뭔가 메모하는데에만 집중하게 되어서

메모는 디테일하게 하고 강의가 좋은 내용이어도 크게 기억이 남지 않는 것 같다.

 

3) 개발서적으로 공부(공부방법_2)

처음에 공부는 자바의 정석으로 공부를 했다.

물론 정말 말그대로 자바 백엔드 개발자라면 누구나 한번즘은 읽을 만한 서적이었다.

그렇게 처음에는 3-4개월은 자바의 정석으로 공부를 했다. 2권중 1권도 전부 못봤다.

동시에 스프링 강의를 들었던 것 같은데.. 음 크게 뭐가 남는것 같지 않았다.

 

4) 개발서적으로 공부(성공한 공부방법_3) 

멘토님이 추천해준 자바의 신을 점심을 빨리먹고 30분간 공부 + 퇴근후 공부하기 시작했다.

중요하다고 생각하는 부분 밑줄을 긋고, 부족하다는 내용을 구글링해서 검색해서 다시한번 훓어보고

파일에 정리하면서 다시 복습하는 시간을 가졌다.

그리고 1달동안 2권중 1권을 다 읽었고, 2달 동안 2권 전부 완독했다..

그러니까 1달동안 1권씩 읽은 셈이다.

 

찾았다. 나에게 맞는 공부법(점심시간 + 퇴근후 공부)

온라인 강의가 잘 정리 되어 있고 빨리 내용을 더 많이 습득할 것 같지만,

개발서적을 구매해서 밑줄 그으며 무슨 내용인지 구글링하며 찾아가며

기본개념을 익히는 공부방법이 머리에 많이 남고 뭔가 그래서 그랬구나 라는 생각을 하며

공부를 하게 되는 것 같다.

'개발자로 취업후 > 오늘생각' 카테고리의 다른 글

실무하면서 정리한 기록들..  (0) 2021.07.12

+ Recent posts