분명 클래스 별로 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

PRIMARY KEY와 UNIQUE KEY 차이점을 막상 얘기하라고 하면 나에게는 조금 헷갈렸기 때문에

공부후에 내가 생각하는 결정적 차이점을 얘기해보려 한다. 

 

PRIMARY KEY(기본키)

-테이블 데이터를 구분짓는 ID에 사용하는 키

-NULL값을 허용하지 않는다. NOT NULL로 반드시 값을 입력해야 한다.

-값이 중복되지 않는다.

 

-예를들어 ID_NO는 PRIMARY KEY이다.

 컬럼 ID_NO가 있다면 ID_00000 과 같은 데이터라고 볼 수 있다.

 

UNIQUE KEY(고유키)

-중복되지 않아야 하는 데이터(데이터만이 가지고 있는 유일한 정보 : 주민번호)에 사용하는 키

-NULL값 허용

-값이 중복되지 않는다.

 

게시글 목록에서 게시글을 눌러서 게시글이 보이도록 구현해보려 한다.

 

1. LatestDAO에서 특정 게시글을 불러오는 함수를 만든다.

 

-위의 해당 데이터를 받아와서 위의 함수를 불러내는 곳으로 반환하도록 한다.

-해당 게시글이 없다면 null을 반환한다.

 

사진

 

2. view.jsp 클래스를 만든다.

-java.io.writer, latest.Latest, latest.LatestDAO 세팅을 한다.

-세션관리 구문 작성한다.

-글의 넘버가 0이 아니라 1이상일 경우에 하기의 인스턴스에 latestID가 담기게 한다.

-latestID(게시글의 넘버)0이면 유효하지 않은 글 메시지가 뜨도록 한다.

 

-작성된 글을 DAO에서 불러와서 출력하는 구문을 작성한다.

-글제목/내용작성시 특수문자 및 공백을 출력이 되지 않고 작성한 글과는 다른 내용이

나오므로 내용출력시 특수문자도 인식할 수 있도록 작성한다.

*크로스 사이트 스크립트 공격방어가 가능하다.

<script> alert(Hello World'); </script>

=> 게시글에 제목은 보이지 않고 들어가면 메시지가 뜨지 않게 된다.

 

-글목록으로 돌아가기, 수정, 삭제 버튼을 만든다.

 

출력화면

 

mysql 데이터베이스에 저장

글 작성후 게시판 메인화면에 글목록이 출력이 되도록 하려고 한다.

 

1. 데이터베이스에서 글의 목록을 가져오는 소스코드를 작성하고

   LatestDAO클래스에 리스트를 담아 반환해주는 ArrayList<Latest>함수를 작성한다.

 

1)특정한 리스트를 담아서 반환할 수 있도록 한다.

게시판은 페이지를 넘어가면서 글들을 읽을 수 있게 한다.

 

2)ArrayList 작성후 외부라이브러리에서 가져올 수 있도록 한다. shift + ctrl + o

public AarrayList<Bbs> getList(int pageNumber) {

ArrayList<Latest> list = new ArrayList<Latest>();

}

 

3)특정한 페이지에 따른 총 10개의 게시글을 가져올 수 있도록 한다.

(10개까지의 데이터만 가져올 수 있도록 쿼리문 작성한다.)

String SQL = "SELECT * FROM LATEST WHERE latestID < ? AND latestAvailable =1 ORDER BY latestID DESC LIMIT 10";

 

3) try catch문에서 try 내에 SQL문을 연결하는 구문 작성한다.

다음게시글의 순서를 가져와서 번호를 예상하게 해서 페이지를 설정하는 구문작성한다.

쿼리를 실행하는 구문작성한다.

 

4)while문 내에 latest인스턴스를 생성해서 set을 해주고 결과를 get으로 가져와서

list에 해당 리스트를 받아와서 add를 통해 반환할 수있도록 한다.

 

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext() -(pageNumber -1) * 10);

rs = pstmt.executeQuery();

while (rs.next()) {

Latest latest = new Latest();

latest.setLatestID(rs.getInt(1));

latest.setLatestTitle(rs.getString(2));

latest.setUserID(rs.getString(3));

lateest.setLatestContent(rs.getString(4));

latest.setLatestAvailable(rs.getInt(6));

list.add(latest);

}

}catch (Exception e) {

e.printStackTrace();

}

return list;

 

5)그리고 try catch문에서 catch문 밖에 return으로 list최종적으로 반환할 수 잇게 해준다.

 

 

2. 페이징처리를 위해 함수를 작성한다.

 

-게시글이 10개라면 다음페이지가 존재하지 않으니

 10개글 또는 10개내의 글의 수만 있다면 다음페이지가 보이지 않게 한다.

-booleantry catch문의 적용

 

public boolean nextPage(int pageNumber) {

String SQL = "SELECT * FROM LATEST WHERE latestID < ? AND latestAvailable = 1";

try{

PreparedStatement pstmt = conn.preparedStatement(SQL);

pstmt.setInt(1, getNext() * (pageNumber-1) * 10);

rs = pstmt.executeQuery();

if(rs.next()) {

return true;

}

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

}

 

 

1번 2번 작성내용

 

3. 위의 두가지 함수를 이용해서 커뮤니티발견(게시판)화면에서 게시글을 볼 수있도록한다.

  latest.jsp 에서 작업

 

1)위의 DAOarraylist를 가져오기 위한 jsp 설정

게시글 누를때에 밑에 밑줄 친 부분이 안보이도록 style로 수정해주기

user아이디 세션관리 할 수 있도록 구문 작성

pageNumberrequest로 받아와서 해당 Parameter의 값을 넣어주어 정수형으로

바꾸어준다.

 

사진

 

2)userID가 없다면 로그인 회원가입 페이지 보여주기 그대로 유지

-아니라면 회원관리 페이지 보여주기

 

3)게시글을 뽑아 올 수 있도록 인스턴스 생성 및 arraylist로 페이지 넘버 얻기

* <% } %> ->으로 위의 구문내용의 끝맺음을 해준다.

 

 

다음버튼

 

이전버튼

+ Recent posts