ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (국비교육) 21 - 스래드 + join + synchronized + 가사출력 + 네이버 화면 만들기 + 하이디 + AQueryTool + DB dto/dao + 싱글턴
    개발/국비교육 2023. 6. 29. 19:30

    ■ Join 메소드 (p. 534)

     

    package threadEx;
    
    import java.awt.Toolkit;
    import java.util.ArrayList;
    
    public class Thread03 extends Thread {
    	int seq;
    	
    	public Thread03(int seq) {
    		this.seq = seq;
    	}
    	
    	@Override
    	public void run() {//오버라이드 해서 적어줍니다. 
    		System.out.println(this.seq + "번째 스래드 시작");
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println(this.seq + "번째 스래드 끝");
    	}
    	
    	//동기화 join : 스래드가 모두 종료된 후에 main 을 종료하겠습니다.
    	public static void main(String[] args) {
    		System.out.println("Main 메소드 시작");
    		
    		ArrayList<Thread03> al = new ArrayList<Thread03>();
    		
    		for (int i = 1; i < 11; i++) {
    			Thread03 thread03 = new Thread03(i);
    			thread03.start();
    			al.add(thread03);//리스트에 담아요.
    		}
    		
    		for (int i = 0; i < al.size(); i++) {
    			Thread03 t = al.get(i);
    			try {
    				t.join();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		System.out.println("Main 메소드 끝");
    		
    	}
    
    }

     

    동기화 join : 스래드가 모두 종료된 후에 main 을 종료하겠습니다.

     

    ■ synchronized 메소드 (p. 534)

     

     

    package threadEx;
    
    public class Calculator {
    	private int memory;
    
    	public int getMemory() {
    		return memory;
    	}
    
    	public synchronized void setMemory(int memory) {
    		this.memory = memory;
    		try {
    			Thread.sleep(2000);
    		} catch (Exception e) {
    		}
    		System.out.println(Thread.currentThread().getName() + ": " + this.memory);
    	}
    }
    package threadEx;
    
    public class User1 extends Thread {
    	private Calculator calculator;
    	
    	public Calculator getCalculator() {
    		return calculator;
    	}
    	
    	public void setCalculator(Calculator calculator) {
    		this.setName("User1");
    		this.calculator = calculator;
    	}
    	
    	@Override
    	public void run() {
    		calculator.setMemory(100);
    	}
    }
    package threadEx;
    
    public class User2 extends Thread {
    	private Calculator calculator;
    	
    	public Calculator getCalculator() {
    		return calculator;
    	}
    	
    	public void setCalculator(Calculator calculator) {
    		this.setName("User2");
    		this.calculator = calculator;
    	}
    	
    	@Override
    	public void run() {
    		calculator.setMemory(50);
    	}
    }
    package threadEx;
    
    public class MainThreadExample {
    	public static void main(String[] args) {
    
    		Calculator calculator = new Calculator();
    		
    		User1 user1 = new User1();
    		user1.setCalculator(calculator);
    		user1.start();
    		
    		User2 user2 = new User2();
    		user2.setCalculator(calculator);
    		user2.start();
    		
    	}
    
    }

     

    ■ 가사 1초마다 나오게 만들어주기

     

    package Music;
    
    public class Melodia{
    	public static void main(String[] args) throws InterruptedException {
    				
    		String cp =  "This is gonna hurt but I blame myself first\r\n"
    				+ "Cause I ignored the truth\r\n"
    				+ "Drunk off that love, fuck my head up\r\n"
    				+ "There's no forgetting you\r\n"
    				+ "You've awoken me, but you're choking me\r\n"
    				+ "I was so obsessed\r\n"
    				+ "Gave you all of me, and now honestly, I got nothing left\r\n"
    				+ "I loved you dangerously\r\n"
    				+ "More than the air that I breathe\r\n"
    				+ "Knew we would crash at the speed that we were going\r\n"
    				+ "Didn't care if the explosion ruined me\r\n"
    				+ "Baby, I loved you dangerously\r\n"
    				+ "Mm, mm\r\n"
    				+ "I loved you dangerously\r\n"
    				+ "Usually, I hold the power with both my hands\r\n"
    				+ "Tied behind my back\r\n"
    				+ "Look at how things change, 'cause now you're the train\r\n"
    				+ "And I'm tied to the track\r\n"
    				+ "You've awoken me, but you're choking me\r\n"
    				+ "I was so obsessed\r\n"
    				+ "Gave you all of me, and now honestly, I got nothing left\r\n"
    				+ "'Cause I loved you dangerously\r\n"
    				+ "More than the air that I breathe\r\n"
    				+ "Knew we would crash at the speed that we were going\r\n"
    				+ "Didn't care if the explosion ruined me\r\n"
    				+ "Baby, I loved you dangerously\r\n"
    				+ "You took me down, down, down, down\r\n"
    				+ "And kissed my lips with goodbye\r\n"
    				+ "I see it now, now, now, now\r\n"
    				+ "It was a matter of time\r\n"
    				+ "You know I know, there's only one place this could lead\r\n"
    				+ "But you are the fire, I'm gasoline\r\n"
    				+ "I love you, I love you, I love you\r\n"
    				+ "I loved you dangerously\r\n"
    				+ "Ooh, more than the air that I breathe\r\n"
    				+ "Oh now, knew we would crash at the speed that we were going\r\n"
    				+ "Didn't care if the explosion ruined me\r\n"
    				+ "Oh, oh baby, I loved you dangerously\r\n"
    				+ "Mm, mm\r\n"
    				+ "Ooh, I loved you dangerously\r\n"
    				+ "Ooh ooh, I loved you dangerously" ;
    		
    		String[] arr01 = cp.split("\r\n");  
    		//System.out.println(Arrays.toString(arr01));
    		
    		//Melodia melodia = new Melodia();
    		
    		for (int i = 0; i < arr01.length; i++) {
    			System.out.println(arr01[i]);
    			Thread.sleep(1000);
    		}
    	}
    }

     

    나의 경우 가사를 string 타입으로 저장하고

    spilit 을 사용하여 \r\n 글자를 기준으로 나눠서 배열에 저장했다.

     

    그리고 이를 for 문을 통해 배열을 출력하도록 했고,

    1초가 지날때마다 나오게끔 했다.

     

    여기서  Thread.sleep(); 을 사용할 수 있는 이유는 

    sleep 이 객체 생성 없이도 사용할 수 있는 메소드여서 그렇다. 

     

    ■ 하이디 활용하기

     

     

    create 사용해서 데이터베이스 만들어주기

     

     

    grant 로 권한 부여하는데 최상위 버전으 choongang 의 모든 권한을 부여해준다.

    TO 를 통해 계정을 생성해주고 비밀번호도 설정해준다.

    % : 어디에서 접근하던 사용하도록 해줄거다

     

     

    사용자가 추가된 것을 확인 가능하다.

     

     

    유저 누구 있는지 확인 가능하다.

    (단 최고관리자 로그인 시에만 보이므로 root 아이디로 확인하자)

     

    * AQueryTool 이용하기 (하단 사이트 링크 有)

     

    AQueryTool 을 이용하면 테이블 생성 SQL을 쉽게 생성할 수 있다.

     

    - PK : 프라이머리키(고유한 키)

    - AI : 자동 숫자 증가

    - FK : 외부키

    - varchar(45) : 캐릭터 45 글자 입력 가능

     

     

    SQL/Menu 들어가서 테이블 생성 SQL 을 통해 코드를 복사해서 

    mariadb에 붙여넣기 하면 된다.

     

    AQueryTool

     

     

    마리아 db에서 테이블이 생성된 것을 확인할 수 있다. 

     

     

    유니크키 지정은 UQ 선택 후 Add Unique Index 하면 된다. 

     

     

    아이디는 유저마다 겹치지 않아야 하므로 유니크 키로 설정한다. 

     

     

    INSERT를 통해 데이터 입력이 가능하다.

    타입에 맞게 데이터를 입력한다. 

     

     

    여기서 프라이머리키만 바꿔서 다시 입력을 하면 오류가 뜬다. 

    왜냐면 아이디가 유니크키로 설정돼 있기 때문에 중복으로 생성 불가하기 때문이다.

     

     

    더불어 데이터행 갯수에 맞게 데이터를 입력하지 않으면 

    데이터 행에 해당하는 mno 값이 빠져서 오류가 뜬다.

     

     

    따라서 해당 사진처럼 설정값을 5개로 지정해주면 오류 뜨지 않고 데이터 입력이 가능하다. 

     

     

    NOW()를 사용하면 현재 시간으로 데이터 입력이 가능하다. 

     

     

     

    테이블 탭에서 기본값 설정을 mgrade 5 mjoindate 는 current_timestamp() 으로 설정해준다.

     

     

     

    그러면 mgrade 와 current_timestamp() 은 기본값 설정이 돼 있기 때문에 넣어주지 않아도 생성된다.

    모든 인원이 동일한 조건이라면 해당 기능을 사용하여 코드를 줄일 수 있다. 

     

     

    여러개 데이터는 다음과 같이 ( ), 를 사용해서 입력 가능하며 마지막은 ; 붙여줘야 한다.

     

     

    WHERE 조건을 걸어서 mname='사과'; 인 데이터를 모두 지울 수 있다. 

     

     

    하지만 해당 데이터를 삭제하고 다시 만들면 프라이머리키 번호가 바뀌어서 생성된다.

     

     

    따라서 고유키 mno를 통해 데이터를 삭제하는 것을 추천한다.

     

     

    UPDATE SET 를 통해 데이터 값을 변경할 수 있다. 

     

     

    AND 조건을 걸어줘서 데이터를 출력할 수 있다. 

     

     

    mgrade = 6 인것이 없기 때문에 아무것도 뜨지 않는다.

     

     

    ■ 이클립스에서 tomcat  이용해서 화면 만들어보기

     

     

    dynamic web project -> jun29web 으로 project 생성

     

    마리아 홈페이지에서 다운받은 connector 다운받은 jar 파일 ctrl + c ctrl + v 또는 드레그 해서 넣기

     

     

    index jsp 파일 만들기

     

    ■ 네이버 로그인 화면 만들기

     

    * index

     

    login.jsp 로 이동할 것이다.

     

     

    구글 폰트 홈페이지에서 폰트 다운로드 가능 (영어로 검색)

     

     

    폰트는 다음 @import를 상단에 작성하고 

    font-family 를 복사해서 붙여넣어주면 사용 가능하다. 

     

     

    https://fonts.google.com/#standard-styles

     

    Browse Fonts - Google Fonts

    Making the web more beautiful, fast, and open through great typography

    fonts.google.com

     

     

    <b> : 볼드표시

     

     

    버튼 스타일을 지정해 줄 수 있다. 

     

    background-color : #2DB400;
    width : 300px;
    height: 50px;
    border: 0px;
    color : white;
    font-size: 20pt;
    font-family: 'Nanum Gothic', sans-serif;
    }

    background-color : 배경색
    width : 300px; : 가로
    height: 50px; : 세로
    border: 0px; : 테두리 
    color : white; : 글자색
    font-size: 20pt; : 글자크기
    font-family: 'Nanum Gothic', sans-serif; : 폰트 스타일
    }

     

    영역을 지정해서 별도로 해당 부분만 효과를 줄 수 있다. 

     

     

    * 로그인 화면 

     

     

     

    <div> 요소는 "순수" 컨테이너로서 아무것도 표현하지 않는다.

    대신 다른 요소 여럿을 묶어 class id 속성으로 꾸미기 쉽도록 돕거나,

    문서의 특정 구역이 다른 언어임을 표시(lang 속성 사용)하는 등의 용도로 사용할 수 있다.

     

    <form> 태그의 action 속성은 폼 데이터(form data)를 서버로 보낼 때 해당 데이터가 도착할 URL을 명시한다.

     

    type="text" 텍스트 입력하고 그 이름을 id 로 지정
    type="password" 패스워드 입력으로 별표시로 보인다. 이름은 pw

     

     

    # : html 태그 아니면 안붙여도 된다.

    id="loginBox" 는 내가 임의로 만든 것이므로 # 붙여준다.

     

    padding : 내영역에서 안쪽으로 여백을 준다

    margin : 내 영역 밖에서 여백을 준다. 

     

     

    input 스타일도 지정 가능

    text - align : center : 가운데 정렬

    margin-bottom : 아래로 여

     

     

    ※ 단축키

    Shift + Home : 코드 한 줄 선택

    Ctrl + Shift + ? : 주석 단축키  

     

     

    input 타도 각각 스타일 설정 따로 가능

     

     

     

    button 타입도 가능하다

     

     

    form action=" " 에 필요한 loginAction.jsp 생성이 필요하다

     

     

    loginAction.jsp 에서 request.getParameter("id") 를 통해 

    입력받은 각각의 값을 가져온다.

     

     

    dto 객체 생성해서 set 메소드를 통해 값을 저장하고

    dao를 login 메소드를 통해 결과를 MemberDTO 타입으로 저장한다.  

     

     

    입력값을 스트링 변수에 저장하면 해당 값을 보다 간단하게 출력 가능하다. 

     

    ■ DTO / DAO 이용하기

     

    java 파일 클릭하고 Class 만들기

    project name : com.poseidon.dto

    class name : MemberDTO

     

     

    MemberDTO MariaDB에서 활용한 데이터 private필드값으로 가져오기

    private 처리한 필드값들을 getter setter 을 사용해준다.

     

     

    jsp에서 자바 영역에 dto 객체를 생성해준다.

    받은 id 와 pw 를 set에 저장해준다.

     

     

    로그인 하는 메소드 만든다.

    login 메소드에 입력받은 MemberDTO  타입 dto 되면 result 라는 객체를 생성한다. 

     

    ■ 싱글턴

     

     

    클래스 변수는 딱 한번만 생기고 안 만들어지는데 static  은 클래스 변수이다. 

    DBConnection 타입의 instance 객체를 한 개 만든 것이다.

     

    이후 private 으로 생성자를 숨김으로 더이상 객체가 만들어질 수 없도록 설정한다. 

     

    이를 호출하는 메소드는 getInstance 로 설정하고 instance를 반환하게 한다.

    대부분의 회사가 getInstance 는 고정적으로 사용한다. 

     

     

    연결을 하는 getConnection  메소드도 만들어준다.

    Class.forName 을 통해 드라이버를 호출한다.

    conn에 접속 정보 바탕으로 연 (URL, ID, PW)

     

     

    conn 을 통해 접속 정보를 가져온다. 

     

    conn = DBConnection.getInstance().getConnection();

               instance 객체를 반환한다. 인스턴스 객체는 DBConnection 타입으로 메소드 호출 가능

               따라서 그 안에 있는 getConnection 을 호출하여 연결까지 해준 것이다. 

               해당 밑줄 부분을 하나의 객체라고 이해하고 그에 맞는 메소드를 불렀다 생각하면 이해하기 쉽다. 

     

    sql 로 할일을 불러온다. 

Designed by Tistory.