여러 테이블의 값을 조회할 때 뷰 외에도 사용할 수 있는 방법이 뭐가 있을까 하다가

여러 시행착오를 겪어보았다.

여기에서 foreach 를 이중으로 써보니 jsp에서 출력이 제곱으로 되는 문제가 있었고,

아직 jstl 문법에서 var와 item 정도 밖에 몰랐던 수준에서는 방법이 보이지 않아

이런저런 뻘짓 끝에 varStatus 라는 문법을 알게 되었다.

(실은 문서도 제대로 찾아보지 않고 학원에서 배운대로만 활용해보려 했던 잘못이기도 하다. 심화해서 작업을 해볼 생각이었으면 조금 장벽에 부딪혔을 때 바로 문서를 찾아보자고 다시 다짐해본다...)

foreach 문에 varStatus를 이용한다면 다음과 같이 이용할 수 있다.

<c:foreach items="${배열이름}" var="별칭" varStatus="상태용 변수">
 
	// 반복해서 표시할 내용 혹은 반복할 구문
 
</c:foreach>

// 배열이름에는 jsp 등에서 setAttribute 등으로 전달한 배열도 활용할 수 있다.
// 별칭은 반복 구문 안에서 사용할 변수의 이름을 별칭으로 지정해주는 형태이다.
/** 
	상태용 변수라는 말은 다양한 방식으로 활용할 수 있다.
    varStatus 뒤에 올 수 있는 값으로는 foreach에 사용가능한 대부분의 값이 올 수 있다.
    예를 들어 current index count begin end step 등을 말한다.
    
    표현 방식은 
    ${상태용 변수.index}
    이런 식으로 활용이 가능하다. 조금만 더 응용해보자면
    한번의 반복문 안에서 같은 인덱스를 공유하는 다른 배열을 처리할 수도 있다.

	ArrayList의 형식을 빌려서 세팅된 배열이 2개 이상 있다고 가정하고
    아래의 코드를 만들어볼 생각이다.
*/


// 예시 구문, 모든 배열은 ArrayList의 형식
// 게시물에 대한 정보를 담은 boardList
// 멤버들의 값이 담긴 membersList,
// 게시물에 대한 덧글들의 관계정보가 담긴 memberReplyList가 세션에 전달되었다고 치자.

<table>
<c:foreach items="${boardList}" var="boardVO" varStatus="status">
	// 게시물의 번호와
    // 그 번호 게시물에 작성자 해당하는 유저의 닉네임
    // 사람들이 그 번호 게시물에 대해 달은 전체 덧글의 수를
    // 같은 인덱스를 공유하며 한번의 반복으로 표현할 수 있습니다.
	<tr>
    	<td>${boardVO.boardNumber}</td>
        <td>
        	${membersList[status.index].nickname}
        	${memberReplyList[status.index].count}
        </td>
    </tr>
</c:foreach>
</table>

 

 문제의,시작

메인 프로젝트의 구성을 만들 때 긁어온 파일이 utf-8과 ms949로도 인코딩이 되지 않자 구글링으로 알아낸 정보가

내가 작업하려던 파일은 euc-kr로 읽으면 깨지지 않는다는 점이었다. 이 문제는 혼자서 프로젝트를 구축할 때는 전혀 문제가 없었는데 협업을 시작하고 난 후에 대환장 파티가 시작되었다.

그것은 바로 깃을 이용해서 나와 협업자들이 pull push를 할때마다 반드시 깨지는 파일들이 나타났다는 점인데,

이는 내가 구축했던 프로젝트는 euc-kr로 자바 소스 파일들을 읽어들이는데, 협업자들은 utf-8로 되어 있어서

서로 작업물을 공유했을 때 문제가 안생기면 이상할 수 밖에 없던 구조인 것이었다.

 

이를 해결하기 위해서

General의 Content Types에 들어가서

상단의 Content types: 에 있는 Text 항목의 하위권에서 내가 바꿨었던 값을 찾았다.

 

여기서 디폴트 인코딩 값이 euc-kr로 되어 있었는데 UTF-8로 바꿔주니 문제가 해결되었다.

(저 부분에서 디폴트 인코딩이 다르게 설정되어 있으면, 프리퍼런스의 워크스페이스와 프로젝트에서의 UTF-8 설정을 한다고 하더라도 적용되지 않고 자바 소스 파일이 생성되거나 수정된다면 euc-kr로 변경된다는 뜻이다. 그래서 한글 깨짐 현상이 반복되었고, 저 처리 이후에는 한글 깨짐 현상은 없어졌다.)

※ 본 포스팅은 현재 국비학원을 다니는 학생의 시점에서 작성된 글입니다.

 

팀 프로젝트는 처음이라 이런 저런 걱정도 되고

하고 싶은건 많지만 억제하면서 협업 중이다.

모든 과정을 여기에 담을 수는 없지만

배운 점이나 간략한 진행 현황은 블로그에 아카이빙하기로 했다.

 

 회의 또 회의

협업에서는 회의의 중요성을 빼놓을 수 없다.

각자의 역할 분담도 중요하지만, 모두가 알아야할 내용도 있고

주제부터 시작해서 테이블명, 입력값, 출력값, 타입, 이용할 기술 스택, 협업 방식, 기본값 설정 여부, 연동 방식 등등.... 논의해야할게 많다. 첫날은 정리할 것도 많고 얘기할 것도 많아서 거의 모든 시간을 회의에 쏟고 정리했다.

다행히 빠르게 시작할 주제가 좁혀져서 다행이었다.

회의의 중요성은 아무리 강조해도 지나치지 않다...

지금은 협업이 처음이라 오랜 시간 회의가 걸렸지만, 나중에는 목표 시간을 잡고 충분한 준비를 해야겠다고 생각했다.

 

 Git 공동 작업자로 이용

지금까지 Git 허브는 혼자서 작업한 내용들을 아카이빙 하는 용도로만 사용하였는데,

깃허브 계정을 하나를 사용해서 돌려쓰는게 아니라

Setting의 Collaborator 를 이용하여 공동 작업자를 추가해서 저 계정들로도 push pull merge 등을 할 수 있게 만들었다.

그러다보니 같은 이름의 파일을 수정해서 커밋을 올렸을 때

같은 이름의 파일을 다른 계정으로 중복해서 커밋을 올리면 conflict가 발생한다는 점도 알게 되었고,

협업은 혼자할 때보다 고려해야할 사항이 더 많아진다는 점을 실감하게 되었다.

Git을 이용할 때는 워크 플로우를 어떻게 하자(commit 전에 저장소에 새롭게 pull 할 내용이 있는지 체크하기 등등) 등의 이야기를 나눌 수 있었고, 순조롭게 작업이 진행되는 중이다.

 

 open api 이용

api 이용에 대해서 겁먹고 있던게 좀 있었기 때문일까

오늘은 오후 시간에 rest api에 대한 사전 지식을 좀 공부해보고 공공 데이터 포털 이용을 위해서

이것저것 뒤져봤었는데 생각보다 시간을 엄청 많이 잡아먹었다....

 

다른 키워드로 찾아보니 그렇게 어렵지만은 않았다.

https://youtu.be/pe5-RQb-OPI

 

이 유튜브 영상과

https://youtu.be/QPEUU89AOg8

이곳의 영상을 살펴보면서 api 에 대한 지식을 좀 더 보충했다.

문서만으로는 구체적으로 그림이 잘 안그려졌는데 유튜브가 큰 도움이 되었다.

git 에 파일들을 나눠서 백업하는 와중에

~~~ /d/JAVA01/workspace/JavaProgram/src (master)
$ git add .
warning: adding embedded git repository: EzenAcademy_BackEnd-JAVA-
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint:
hint:   git submodule add <url> EzenAcademy_BackEnd-JAVA-
hint:
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint:
hint:   git rm --cached EzenAcademy_BackEnd-JAVA-
hint:
hint: See "git help submodule" for more information.

 

와 같은 문구가 출력되었다.

그래서 원인을 분석해보니

warning: adding embedded git repository라는 경고 문구는

하위 폴더에 .git 폴더가 이미 생성 되어 있는 경우에 나올 수 있는 문구였다.

이와 같은 상황일 때는 하위 폴더의 .git을 전부 제거한 후에

상위 폴더에서 이용하면 말끔히 해결되었다!!

※ 본 포스팅은 공부한 내용 아카이빙으로 간단하게 작성하였습니다.

oracle을 통해 sql문을 처음 접했는데 가독성이 프로그래밍 언어보다는 좋았다

간단하게 insert와 update, delete에 사용했던 구문을 남겨보고자 한다.

 insert 문

public class JDBC_Insert {

  public static void main(String[] args) {
		
    Connection con = null;
    PreparedStatement pstmt = null;
		
      try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger");

        Scanner sc = new Scanner(System.in);

        System.out.print("저장할 번호를 입력하세요 : ");
        int num = Integer.parseInt( sc.nextLine() );
        System.out.print("이름을 입력하세요 : ");
        String name = sc.nextLine();
        System.out.print("이메일 입력하세요 : ");
        String email = sc.nextLine();
        System.out.print("전화번호를 입력하세요 : ");
        String tel = sc.nextLine();

        String sql = "insert into customer values( ? , ? , ? , ? )";

        pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, num);
        pstmt.setString(2, name);
        pstmt.setString(3, email);
        pstmt.setString(4, tel);

        int result = pstmt.executeUpdate();

        if( result == 1 ) System.out.println("레코드 추가 성공");
        else System.out.println("레코드 추가 실패");
			
		}catch(ClassNotFoundException e) {			e.printStackTrace();
		}catch(SQLException e) {			e.printStackTrace();
		}catch(Exception e) {
		}
		
		try {
			if( con != null) con.close();
			if(pstmt != null) pstmt.close();
		} catch (SQLException e) {			e.printStackTrace();
		}

	}

}

 

 update 구문

public static void main(String[] args) {
    String url = "jdbc:oracle:thin:@localhost:1521:xe";
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        con = DriverManager.getConnection(url, "scott", "tiger");

        Scanner sc = new Scanner(System.in);
        System.out.println("수정할 회원의 번호를 입력하세요 : ");
        int num = Integer.parseInt(sc.nextLine());

        System.out.println("수정할 항목을 선택하세요 1. 이름 2. 이메일 3. 전화번호");
        String input = sc.nextLine();

        String sql = "";
        switch(input) {
            case "1":
                System.out.print("수정할 이름을 입력하세요 : ");
                String name = sc.nextLine();
                sql = "update customer set name=? where num=?";
                pstmt = con.prepareStatement(sql);
                pstmt.setString(1, name);
                break;
            case "2":
                System.out.print("수정할 이메일을 입력하세요 : ");
                String email = sc.nextLine();
                sql = "update customer set email=? where num=?";
                pstmt = con.prepareStatement(sql);
                pstmt.setString(1, email);
                break;
            case "3":
                System.out.print("수정할 전화번호를 입력하세요 : ");
                String tel = sc.nextLine();
                sql = "update customer set tel=? where num=?";
                pstmt = con.prepareStatement(sql);
                pstmt.setString(1, tel);
                break;
        }
        pstmt.setInt(2, num);

        int result = pstmt.executeUpdate();
        if(result == 1) System.out.println("수정 성공~");
        else System.out.println("수정 실패 ㅠ");

    }catch(ClassNotFoundException e){	e.printStackTrace();
    }catch(SQLException e) {		e.printStackTrace();
    }

    try {
        if(pstmt != null) pstmt.close();
        if(con != null) con.close();
    }catch(SQLException e) { e.printStackTrace();}

}

 

 delete 구문

 

public class JDBC_Delete {

	public static void main(String[] args) {
		
		Connection con = null;
		PreparedStatement pstmt = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger");
			Scanner sc = new Scanner(System.in);

			System.out.println("삭제할 회원의 번호를 입력하세요 : ");
			int num = Integer.parseInt(sc.nextLine());
			
			String sql = "delete from customer where num=?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, num);
			int result = pstmt.executeUpdate();
			if(result == 1) System.out.println("수정 성공~");
			else System.out.println("수정 실패 ㅠ");
			
		}catch(ClassNotFoundException e) {e.printStackTrace();
		}catch(SQLException e) {e.printStackTrace();
			
		}
		try {
			if(pstmt != null) pstmt.close();
			if(con != null) con.close();
		}catch(SQLException e) {e.printStackTrace();}

	}

}

 

function solution(n) {
    var answer = 0;

    for(let i=2 ; i<=n ; i+=2)
        answer += i;

    return answer;
}

 

 

function solution(n) {
  return Array(n)
    .fill()
    .map((_, i) => i + 1)
    .filter((v) => v % 2 === 0)
    .reduce((acc, cur) => acc + cur, 0);
}

 

function solution(n) {
    return Array(n).fill(1).map((v,i)=>v+i).filter(v=>v%2===0).reduce((a,v)=>a+v,0);
}

 

function solution(n) {
    return n===1 ? 0 : Array(n).fill(0).map((v, index) => v+index+1).filter((v) => v%2===0).reduce((a,b) => a+b);
}

+ Recent posts