//방법1.

function Car(name,color){

this.name = name;

this.color = color;

this.show = function(){console.log(name, color)}

}


var car1 = new Car('morning','blue');

car1.show();



//방법2. 프로토타입 이용


function BigCar(name, color){

this.name = name;

this.color = color;

}


BigCar.prototype.show = function(){

console.log('bigcar' ,this.name , this.color)

}

//자식 객체 1

var bigcar1 = new BigCar('churare','white');

bigcar1.show();

//자식 객체 2

var bigcar2 = new BigCar('dump','black');

bigcar2.show();



//방법3. 객체리터럴(싱글톤)

var smallcar = {

name: "tico",

color: "blue",

show: function(){

console.log('smallcar',this.name,this.color);

}

}

//할당

smallcar.name = "morning2";

smallcar.color = "gold";

smallcar.show();



//*******************************************************js getter setter 1************************************************

var person = {

    firstName: 'Jimmy',

    lastName: 'Smith',

    get fullName() {

        return this.firstName + ' ' + this.lastName;

    },

    set fullName (name) {

        var words = name.toString().split(' ');

        this.firstName = words[0] || '';

        this.lastName = words[1] || '';

    }

}


person.fullName = 'Jack Franklin';

console.log(person.firstName); // Jack

console.log(person.lastName) // Franklin



//*******************************************************js getter setter 2****************************************************

var person2 = {

    firstName: 'kang',

    lastName: 'youngkyuen'

};


Object.defineProperty(person2, 'fullName', {

    get: function() {

        return this.firstName + ' ' + this.lastName;

    },

    set: function(name) {

        var words = name.split(' ');

        this.firstName = words[0] || '';

        this.lastName = words[1] || '';

    }

});

console.log(person2.fullName) 



//********************************************************************************************




//------------------------------------------

function Student(name, age) {

    this.name = name;

     

    this.getName = function() {

        return this.name;

    }

    this.setName = function(name) {

        this.name = name;

    }

}

var preamtree = new Student(name);



//------------------------------------------

function Student(name, age) {

    this.name = name;

}

Student.prototype.getName = function() {

    return this.name;

}

 

Student.prototype.setName = function(name) {

    this.name = name;

}

var preamtree = new Student(name);


//---------------------------------------------------------------------------

//prototype에 프로퍼티를 추가하는 함수

Function.prototype.method = function(name, func) {

    if(!this.prototype[name]) {

        this.prototype[name] = func;

    }

}

 

function Person(name, age) {

    this.name = name;

}

 

// prototype에 프로퍼티를 추가할 때마다 '.prototype'을 반복할 필요가 없음.

Person.method('getName',  function() {

    return this.name;

});

 

Person.method('setName', function(name) {

    this.name = name;

});



//********************************* 상속 *********************************


//부모 클래스

function Car(name,color){

this.name = name;

this.color = color;

this.show = function(){

return this.name + ' ' + this.color;

}


}



function create(o) {

    function F() {}; //빈 자식 클래스

    F.prototype = o;

    return new F(); // o를 부모로하는 객체 리턴

}


var myPcar = new Car('pCar','BLACK');

var sunCar = create(myPcar);

var text = sunCar.show();

console.log(text);



  1. 2018.10.17 16:14

    비밀댓글입니다

//person.js

// person data object.  setter getter 만드는 방법


var firstName, lastName, age;


exports.setFirstName = function (fname) {

    firstName = fname;

};


exports.setLastName = function (lname) {

    lastName = lname;

};


exports.setAge = function (yrsold) {

    age = yrsold;

};


exports.getPersonInfo = function () {

    return {

        firstName: firstName,

        lastName: lastName,

        age: age

    };

};

---------------------------------------------------------------------------------------------------------------


//app.js

var person = require('./person.js');


// steve 라는 이름 할당

person.setFirstName('Steve');


// jobs 라는 이름 할당

person.setLastName('Jobs');


// 56 

person.setAge(56);


console.log(person.getPersonInfo());








//관련 모듈 설치
//npm i nodemailer
//npm i nodemailer-smtp-transport





var nodemailer = require('nodemailer');
//smtp 서버를 사용하기 위한 모듈이다.
var smtpTransport = require('nodemailer-smtp-transport');



//아이디가 존재할 경우
//숫자 + 문자 + 특수문자 새로운 비밀번호 생성하고
var arr = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,~,`,!,@,#,$,%,^,&,*,(,),-,+,|,_,=,\,[,],{,},<,>,?,/,.,;".split(",");
var randomPw = createCode(arr, 10);


//비밀번호 랜덤 함수
function createCode(objArr, iLength) {
var arr = objArr;
var randomStr = "";
for (var j=0; j<iLength; j++) {
randomStr += arr[Math.floor(Math.random()*arr.length)];
}
return randomStr
}




//이메일 발송함수
function sendNewPwFunc(email,pw){

var transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
host: 'smtp.gmail.com',
auth: {
user: 'thanksman1211@gmail.com',
pass: 'project100$1'
}
}));
var mailOptions = {
from: 'thanksman1211@gmail.com',
to: email,
subject: 'Sending Email using Node.js[nodemailer]',
html:'<h1>00에서 새로운 비밀번호를 보내드립니다.~~~~</h1> <h2>' + pw + '</h2>'
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
return false;
} else {
console.log('Email sent: ' + info.response);
console.log("새로운 비밀번호가 발송되었습니다.");
return true;
}
});

return true;
}




objective c 기초


=============== 반환값, 파라미터가 객체일때 표기법

  • 반환값, 파라미터가 객체 : 클래스 이름과 * 을 사용한다.

    - (NSString *)uppercaseString;

  • 구조체: * 없이 사용

    - (NSRange)rangeOfString:(NSString *)aString; 


=============== 객체 생성하기


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {

   @autoreleasepool {

      

      NSObject *obj1 = [[NSObject alloc] init]; // 반환값이 객체이기 때문에 *변수 사용.

      NSLog(@"Object : %@", obj1);

      

              NSObject *obj2 = obj1;

      NSLog(@"Obj2 : %@", obj2);


   }

    return 0;

}


=============== 지역변수 전역변수

ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@property (nonatomic,strong) NSString *name;


@end


ViewController.m

#import "ViewController.h"


@interface ViewController ()


@property(nonatomic, strong) NSString *vehicle;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    NSLog(@"이름: %@" , self.name);

    

    self.name = @"anna";

    

    NSLog(@"이름: %@" , self.name);

    

    _name = @"bob";

    

    NSLog(@"이름: %@" , _name);

    

    [self setName:@"cant"];

    

    NSLog(@"이름: %@", [self name]);

    

}


출력

ObjectiveCAlert[1414:212708] 이름: (null)

2018-07-28 10:51:53.207975+0900 ObjectiveCAlert[1414:212708] 이름: anna

2018-07-28 10:51:53.208148+0900 ObjectiveCAlert[1414:212708] 이름: bob

2018-07-28 10:51:53.208421+0900 ObjectiveCAlert[1414:212708] 이름: cant


======================= 지역변수 전역변수

Person.h

#import <Foundation/Foundation.h>


@interface Person : NSObject

{

    //지역변수라서 같은 클래스 안에서 만 접근가능하다.

    BOOL isInsecure;

}


//전역변수라서 어디에서든 접근가능하다.

@property (nonatomic,strong) NSString *firstName;

@property (nonatomic,strong) NSString *lastName;


//전역메서드 - 이곳에 작성안해주면 viewcontroller 즉 다른 클래스에서 접근할 수 없다.!

-(void)test;



@end



Person.m

#import "Person.h"


@implementation Person


-(void)test{

    

    self.firstName = @"bob";

    

    _firstName = @"jack";

    

    isInsecure = YES; //지역변수라서 접근가능

    

    [self setLastName: @"davis"];

    

    NSString *name = [self firstName];

    NSString *nicname = [self lastName];

    

    NSLog(@"이름: %@ - 닉네임: %@",name,nicname); //이름: jack - 닉네임: davis

}


@end


ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@end

ViewController.m

#import "ViewController.h"

#import "Person.h" //import 해준다!

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    Person *person1 = [[Person alloc]init]; //객체 생성 및 초기화


    person1.firstName = @"kang"; //변수 할당


    [person1 setLastName:@"gil dong"]; // 변수할당

    

    //person1.isInsecure = NO; 지역변수라서 다른 클래스에서 접근 불가능

    

    //NSLog(@"%@", person1.firstName); //kang

    //NSLog(@"%@", person1.lastName); //gil dong

   

    [person1 test]; //이름: jack - 닉네임: davis


}


@end


======================= setter getter 활용법


Vehicle.h

#import <Foundation/Foundation.h>


@interface Vehicle : NSObject


@property (nonatomic) long odomater;


@property (nonatomic,strong) NSString *model; //포인터 변수


@end


Vehicle.m

#import "Vehicle.h"


@implementation Vehicle


//셋터구현 - 불필요한 값을 검증하기 위해 사용되는 예

-(void)setOdomater:(long)odomater{

    if(odomater > _odomater){ //원래 값이 입력한 값 보다 크면

        _odomater = odomater;

    }

}


-(NSString *)model{

    if([_model isEqualToString:@"honda"]){

        return @"oh no~~~";

    }else{

        return _model; //입력한 값

    }

}


@end


ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@end


ViewController.m

#import "ViewController.h"

#import "Vehicle.h"

@interface ViewController ()

@end


@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];


    Vehicle *car = [[Vehicle alloc]init];

    

    //section1

    /*

    car.odomater = -100;

    NSLog(@"odometer: %lu", car.odomater); //0

    

    car.model = @"honda";

    NSLog(@"나는 %@ 를 운전합니다." , car.model); //나는 oh no~~~ 를 운전합니다.

     */

    

    //section2

    car.odomater = 100;

    NSLog(@"odometer: %lu", car.odomater); //100

    

    car.model = @"ferari";

    NSLog(@"나는 %@ 를 운전합니다." , car.model); //나는 ferari 를 운전합니다.

}

@end



======================= NSString

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    NSString *firstName = @"John";

    NSString *allocatedString = [[NSString alloc]init];

    

    NSLog(@"name: %@", firstName); //name: John

    

    NSString *fullName = [NSString stringWithFormat:@" %@ smith %@",firstName , @"Charles the III"];

    

    NSString *display = [fullName stringByAppendingString: @" - Died 1448"];

    

    NSLog(@"fullName: %@", fullName); //fullName:  John smith Charles the III

    

    NSLog(@"display: %@", display); //display:  John smith Charles the III - Died 1448

   

    

    

    NSString *var1 = @"Junk";

    NSString *var2 = @"in the trunk";

    NSString *var3 = @"junk";

    

    if(![var1 isEqualToString:var2]){

        NSLog(@"var1 과 var2 는 같지 않습니다."); //var1 과 var2 는 같지 않습니다.

    }

    

    if([var1.lowercaseString isEqualToString: var3]){

        NSLog(@"var1 과 var3은 같습니다. -1"); //var1 과 var3은 같습니다. -1

    }

    

    if([var1 caseInsensitiveCompare:var3] == NSOrderedSame){

        NSLog(@"var1 과 var3은 같습니다. -2" ); //var1 과 var3은 같습니다. -2

    }

    

    

    

    //초기화

    //NSString *str = [[NSString alloc]initWithString:@"This is NSString"];


    //간소하게

    NSString *str = @"This is NSString";

    NSLog(@"str : %@",str); //This is NSString

    

    //immutable class - 변경 불가

    NSString *result;


    result = [str substringFromIndex:6]; //6번째 문자열 이후의 문자열 출력 NSString

    result = [str substringToIndex:3]; // 앞에서 3번째 문자열 까지 출력 Thi

    

    result = [[str substringToIndex:11]substringFromIndex:8];   // NSS

    result = [[str substringFromIndex:8] substringToIndex:3];   // NSS

    

    result = [[str substringWithRange:NSMakeRange(8, 3)] lowercaseString];  //nss

    

    NSLog(@"result : %@", result);

    


    //mutable - 변경가능

    NSMutableString *mstr = [NSMutableString stringWithFormat: str];

    [mstr appendString: @" and NSMutableString"];

    [mstr insertString:@"Mutable " atIndex:8];

    NSLog(@"mstr : %@", mstr); //his is Mutable NSString and NSMutableString


    

}



@end


======================= NSNumber

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    int imAnIn = 5;

    float iAmFloat = 3.3;

    double iAmTheDouble = 5.666664;

    

    NSLog(@"Int: %d", imAnIn);

    NSLog(@"iAmFloat: %f", iAmFloat);

    NSLog(@"iAmTheDouble: %f", iAmTheDouble);

    

    //NSNumber 초기화

    NSNumber *numInt = [NSNumber numberWithInt:5];

    NSNumber *numInt2 = [NSNumber numberWithInt:6];

    

    //int로 형변환

    int val = numInt.intValue;

    int val2 = numInt2.intValue;

    

    int sum = val + val2;

    

    NSLog(@"sum : %d",sum);

    

    //NSNumber로 형변환

    NSNumber *numSum = [NSNumber numberWithInt:sum];

    

    //배열에 담기

    NSArray *arr = @[numInt, numInt2, numSum];


    //numSum을 스트링 타입으로 변환

    NSString *str = numSum.stringValue;

    

    

    NSInteger someInt = 55;

    

    //오류

   //NSNumber *sumNum = [numInt intValue] * [numInt2 intValue];

    NSNumber *sumNum = [NSNumber numberWithInt:(numInt.intValue) * (numInt2.intValue)];

    NSLog(@"sumNum : %@",sumNum); //30

    

}


@end



======================= 클래스 메서드, 인스턴스 메서드



person.h

#import <Foundation/Foundation.h>


@interface Person : NSObject


- (void)speakName;

+ (void)stateSpecies;



@end


person.m

#import "Person.h"


@implementation Person



- (void)speakName{

    NSLog(@"my name is jack!");

}


+ (void)stateSpecies{

    NSLog(@"i am a human");

}



@end


ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@end


ViewController.m

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    Person *person =[[Person alloc]init];

    

    [person speakName];         //인스턴스 메서드 (-) my name is jack!


    [Person stateSpecies];     //클래스 메서드 (+) i am a human

    

}


@end



======================= 메서드 체인 (예) - 위에 코드와 아래 4줄 코드는 같다.



======================= swift를 objective c로 변환해보기



#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@property (nonatomic) double bankAccount;

@property (nonatomic) double itemAmount;

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    self.bankAccount =  500.0;

    self.itemAmount = 400.0;

    

    //실행

    [self playground];

    //살 수 있음!

    //player b wins!

}


//구입가능여부 체크

- (BOOL) canPurchase: (double) amount {

    if(self.bankAccount >= amount){

        return YES;

    }

    return NO;

}



//우승자 선정 함수

- (void) declareWinnerWithPlayerAScore:(NSInteger)scoreA playerBScore:(NSInteger)scoreB{

    if(scoreA > scoreB){

        NSLog(@"player a wins!");

    }else if(scoreB > scoreA){

         NSLog(@"player b wins!");

    }else{

         NSLog(@"again");

    }

}



//실행 함수

- (void) playground{

    //구입 여부 함수 호출

    if([self canPurchase:self.itemAmount]){

        NSLog(@"살 수 있음!");

    }

    

    //우승자 선정 함수 호출

    [self declareWinnerWithPlayerAScore:55 playerBScore:66];

    

}



@end




======================= 고정배열, 가변 배열

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    NSArray *arr = [NSArray arrayWithObjects:@"my", @"mother", @"told", @"me", nil];

    NSArray *arr2 = @[@"donkey",@"kong" , @"ate", @"your", @"mom"];

    NSString *str = [arr objectAtIndex:2];

    NSLog(@"str : %@",str); //str : told

    

    arr = @[@"mario" , @"hahahoho"]; //재할당;

    NSLog(@"arr num %li", arr.count); //2

    

    // 가변 배열 ---------------------------------------

    

    NSMutableArray *mut = [NSMutableArray arrayWithObjects:@"boom",@"jam",@"slam",@"pam", nil];

    NSLog(@"mut: %@", mut.debugDescription);

    /*

     (

     boom,

     jam,

     slam,

     pam

     )

     */

    

    //삭제

    [mut removeObjectAtIndex:2];

    //삽입

    [mut addObject: @"beast master"];

    

    NSLog(@"mut 2: %@", mut.debugDescription);

    /*(

    boom,

    jam,

    pam,

    beast master

    )*/

    

    NSArray *arr3 = [NSArray arrayWithArray:arr];

    NSArray *arr4 = mut;

    

    //NSMutableArray *arr4 = arr; 오류

    

    //

    NSArray *frutie = [[NSArray alloc]initWithObjects:@"apple",@"banana", @"pineapple", @"lemon", nil];


    /* for 문 예제 1

     for (int i = 0; i< [frutie count]; i++){

     NSLog(@"frute : %@", [frutie objectAtIndex:i]);

     }

     */


    //for 문 예제2

    for (NSString *strTemp in frutie) {

        NSLog(@"과일1 : %@" , strTemp);

    }

    


    //가변 array

    //할당

    NSMutableArray *ffrute = [NSMutableArray arrayWithArray:frutie];

    

    [ffrute addObject:@"tomato"];

    [ffrute addObject:@"wotermelon"];

    [ffrute addObject:@"mango"];

    

    for (NSString *strTemp in ffrute){

        NSLog(@"과일2 : %@", strTemp);

    }


}


@end



======================= 딕셔너리

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    //dictionary

    NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"강", @"이름", @"20", @"나이", nil];

    

    NSLog(@"name : %@" , [dic objectForKey:@"이름"]);

    NSLog(@"age : %@" , [dic objectForKey:@"나이"]);

    

    //가변 dictionary

    NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithDictionary:dic];

    

    [mdic setObject:@"한국" forKey:@"사는곳"];

    [mdic setObject:@"까무잡잡" forKey:@"얼굴색"];

    NSLog(@"location : %@" , [mdic objectForKey:@"사는곳"]);

    NSLog(@"face color : %@" , [mdic objectForKey:@"얼굴색"]);

    

    //-----------------------------------------------------------------------------

    

    

    NSNumber *age = [NSNumber numberWithInt:40];

    NSNumber *age2 = [NSNumber numberWithInt:34];

    

    NSDictionary *dic1 = @{@"jack":age, @"jon:":age2};

    NSDictionary *dic2 = [[NSDictionary alloc]init];

    

    int jacksAge = [[dic1 objectForKey: @"jack"] intValue];

    

    NSNumber *age3 = [dic1 objectForKey:@"jack"];

    int jacksAge2 = [age3 intValue];

    

    

    NSLog(@"jacks age : %d",jacksAge); //jacks age : 40


    NSMutableDictionary *mut = [@{@"1":@"bmv",@"2":@"volvo",@"3":@"ugly"} mutableCopy];

    NSLog(@"%@",mut);

    /*

     {

     1 = bmv;

     2 = volvo;

     3 = ugly;

     }

     */

    

    NSMutableDictionary *mut2 = [[NSMutableDictionary alloc]init];

    

    [mut2 setObject:@"an object" forKey:@"a key"];

    [mut2 setObject:[NSNumber numberWithDouble:20.000] forKey:@"doubletrouble"];

    

    NSLog(@"%@",mut2);

    /*

     {

     "a key" = "an object";

     doubletrouble = 20;

     }

     */

}




@end


======================= 객체지향 예 1

Vehicle.h

#import <Foundation/Foundation.h>


@interface Vehicle : NSObject

//부모 프로 퍼티

@property (nonatomic,strong) NSString *make;

@property (nonatomic,strong) NSString *model;

@property (nonatomic,strong) NSString *engineSize;

-(void)drive;

@end


Vehicle.m

#import "Vehicle.h"


@implementation Vehicle


//부모 메소드

-(void)drive{

    NSLog(@"i am driving");

}


@end


Civic.h

#import "Vehicle.h"


//Vehicle 의 서브 클래스

@interface Civic : Vehicle


-(void)test;

@end



Civic.m

#import "Civic.h"


@implementation Civic


//초기화

- (id)init

{

    if( self = [super init]){

    

    }

    

    //자신의 drive 호출

    [self drive];

    return self;

}


//여기에만 적어주면 이 클래스 안에서만 호출 가능. Civic.h에 적어주면 다른 클래스에서도 호출 가능!!!!

-(void) test{

    self.make = @"honda";

    self.model = @"civic";

}



-(void) drive {

    NSLog(@"drive from subclass");

    //부모 drive 호출

    [super drive];

}


@end



ViewController.m

#import "ViewController.h"

#import "Civic.h"

@interface ViewController ()

@property(nonatomic,strong) NSString *iAmPrivate;

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    //객체생성

    Civic *civic = [[Civic alloc]init];

    

    

    // 호출 안해주면 밑에 nslog는 둘다 nil.., Civic.h에 구현 안해주면 이곳에서 호출 불가능..

    [civic test];

    

    //[civic drive];

    NSString *model = [civic model];

    NSString *make = [civic make];

    

    NSLog(@"make :  %@ " ,make); //make :  honda

    NSLog(@"model :  %@ " ,model); //model :  civic


}

@end








'ios 뽀개기 > objective-c' 카테고리의 다른 글

objective c 의 모든것  (5) 2018.07.28
objective c alert 구현  (0) 2018.07.28
객체지향 예제  (0) 2018.07.10
array dictionary  (0) 2018.07.10
NSString 예제  (0) 2018.07.09
if문 for문 switch문  (0) 2018.07.09
  1. 2018.09.10 10:52

    비밀댓글입니다

  2. 2018.09.10 16:10

    비밀댓글입니다

  3. 2018.09.28 14:50

    비밀댓글입니다

  4. 2018.10.05 08:48

    비밀댓글입니다

  5. 2018.10.11 17:01

    비밀댓글입니다

alert 구현






- (IBAction)alert:(id)sender {

    

    //팝업구현을 하는 클래스

    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"알림" message:@"환영합니다." preferredStyle:UIAlertControllerStyleAlert];

    

    //팝업 버튼 구현하는 클래스

    UIAlertAction *closeAction = [UIAlertAction actionWithTitle:@"닫기" style:UIAlertActionStyleCancel handler:nil];

    

    //팝업 클래스에 버튼을 넣는 메소드 호출

    [alert addAction:closeAction];

    

    //나타나게

    [self presentViewController:alert animated:YES completion:nil];

    

}

'ios 뽀개기 > objective-c' 카테고리의 다른 글

objective c 의 모든것  (5) 2018.07.28
objective c alert 구현  (0) 2018.07.28
객체지향 예제  (0) 2018.07.10
array dictionary  (0) 2018.07.10
NSString 예제  (0) 2018.07.09
if문 for문 switch문  (0) 2018.07.09

스프링 기초 DI 예제 4


[스프링 컨테이너 생명 주기]

      

      스프링 컨테이너 생성   : GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();

       ------> 설정    :  ctx.load("classpath:baseBall.xml");

                     ctx.refresh(); 

       ------> 사용    :  Player player =ctx.getBean("player".Player.class); 

            player.getName();

            player.getPosition();

       ------> 종료    :ctx.close()



 [빈 Life cycle(생명주기)]

   

   ctx.refresh 과정에서 빈이 생성 

   

   ctx.close() 컨테이너가 소멸하는 단계에서 빈도 자동으로 소멸됩니다.

    

   InitializingBean 인터페이스 -  초기화 할때 작동

    구현해야 할 메소드

    public void afterPropertiesSet() throws Exception

   

   DisposableBean 인터페이스 -  소멸될때 작동

    public void destroy() throws Exception  

   InitializingBean, DisposableBean은 따로 구현 해도 되고, 동시에 구현해도 된다.


# 어노테이션을 활용하는 방법

    @PostConstruct

    public void initMethod(){}

     - 빈 초기화 과정에서 빈이 생성되기 전에 해야할 작업을 할 수 있다.

     

     

    @PreDestroy    

public void destroyMethod(){}

- 종료되는 시점에 빈 소멸전에 해야할 작업을 할 수 있다.

(컨테이너 안에 빈이 들어 있다.)


예제1)





   [빈의 범위(scope)]

범위는 해당하는 객체가 어디까지 영향을 미치는지 결정하는 것

<bean> 태그의 속성 값 : default 값은 singleton

  singleton : 스프링 컨테이너에 의해 한개의 빈객체만 생성

  prototype : 빈을 사용할 때 마다 객체를 생성

  request : HTTP 요청 마다 빈 객체를 생성(WebApplicationContext에서만 적용)

  session : HTTP 세션 마다 빈 객체를 생성(WebApplicationContext에서만 적용)

  global-session : 글로발 HTTP 세션에 대해 빈 객체를 생성. 





[커스텀 초기화 메소드/ 커스텀 소멸 메소드]  

:객체의 생성과 소멸시에 특정 메소드를 실행시키고 싶을 때 사용한다.  

- init-method : 커스텀 초기화 메서드를 지정하는 <bean>태그의 속성

- destroy-method : 커스텀 소멸 메서드를 지정하는 <bean>태그의 속성 

** BeanNameAware 인터페이스

: 빈객체가 자기자신의 이름을 알아야 할 경우 사용된다.

: 클래스가 BeanNameAware 인터페이스를 구현한 경우 컨테이너는 setBeanName()메서드를 호출해서 빈객체의 이름을 전달

: setBeanName(String arg) : 객체가 생성될 때 해당 객체의 id나 name값을 전달 받는 메서드



[외부 파일을 이용한 빈 설정]

 

- EnvironmentAware, Envirionment 인터페이스를 활용

 

  . Context  --> getEnvironment() -->Environment 객체 얻기

  . Environment  -->getPropertySources 객체를 얻기

  . PropertySources -->프로퍼티를 추가(addLast)하거나, 추출(getProperty) 작업을 한다.

 

 

- 프로퍼티 파일을 이용한 빈설정

 

  .XML 파일에 외부프로퍼티 파일을 명시하는 방법

 

 

  .Java 파일에 외부 프로퍼티 파일을 명시하는 방법

 

 










springDemo_2.zip


'매일코딩 > Spring' 카테고리의 다른 글

스프링 기초 DI 예제 4  (2) 2018.07.17
스프링 기초 DI 예제 3  (0) 2018.07.17
스프링 기초 DI 예제2  (0) 2018.07.16
스프링 기초 DI 예제1  (0) 2018.07.16
31.스프링프로젝트 - 조회  (0) 2016.11.21
30.스프링프로젝트 - 답변  (0) 2016.11.21
  1. 2018.08.30 15:06

    비밀댓글입니다

  2. 2018.08.31 16:55

    비밀댓글입니다

스프링 기초 DI 예제 3



[의존성 주입 종류]

    setter(설정 메소드)를 이용한 주입 

    : 설정 메소드를 사용해서 의존성을 주입하는 것

    

    Constructor(생성자)를 통한 주입

    : 생성자를 사용해서 의존성을 주입하는 것

   

   

   [의존성 주입(DI)의 장점]

DI를 사용하면 개발 계획시에 시간이 요구가 되지만, 규모가 큰 프로젝트에서 유지보수 업무를 

한다면 DI 개발의 장점을 느낄 수 있다.  

   

   

   [의존 관계 설정 방법]

   - XML파일을 이용한 설정방법

   

   - JAVA를 이용한 설정방법(어노테이션을 이용한다. @Configuration, @Bean)

     

     : 어노테이션(Annotation:Metadata)-JDK5부터 등장한 개념 ex)@Override

         선언시에는 @를 사용하여 선언한다.

         어노테이션은

     . 컴파일러에게 정보를 알려주거나

     . 컴파일 할 때와 설치(deployment)시의 작업을 지정하거나

     . 실행할 때 별도의 처리가 필요한 경우

         사용한다.

   클래스, 메소드, 변수 등 모든 요소에 선언이 가능하다.

   

       

       # @Configuration : 클래스앞에 선언하는데, "이 클래스는 스프링 설정에 사용되는 클래스 입니다" 라고 알려주는 어노테이션

       # @Bean : 메소드 앞에 선언, "객체를 생성"

   


예제1)


예제2) 자바로 빈객체 만들기

예제3)



예제4)자바 코드에서 xml 불러오는 방법


springDemo_1.zip


 

'매일코딩 > Spring' 카테고리의 다른 글

스프링 기초 DI 예제 4  (2) 2018.07.17
스프링 기초 DI 예제 3  (0) 2018.07.17
스프링 기초 DI 예제2  (0) 2018.07.16
스프링 기초 DI 예제1  (0) 2018.07.16
31.스프링프로젝트 - 조회  (0) 2016.11.21
30.스프링프로젝트 - 답변  (0) 2016.11.21


sql 인젝션



1.입력데이터 검증 기법

2.sql 인젝션

3.명령어 인젝션 취약점원인



입력데이터 검증 방식 


입력데이터 처리를 위한 규칙




설계자나 개발자는 외부에서 입력되는 값을 철저히 통제해야됨



입력값 검증은 애플리케이션에서 먼저 체크되어야 함


서버 애플리케이션에도 체크되어야 함



view  컴포넌트, controller 컴포넌트에 동시에 체크 해야 함



#sql 인젝션 취약점 개요



웹 애플리케이션에서 값을 입력받을 때 

동적 쿼리 생성, 데이터 베이스에 쿼리를 전달하여 실행하는 경우 발생


검증되지 않은 외부 입력값으로 인해 정상적인 쿼리가 변조되어 데이터 베이스에 불법적으로

데이터 열람, 수정, 삭제 됨


저장된 프로시저를 사용하여 시스템 명령 수행




비정상적으로 데이터베이스에 접근하거나 제어하는 공격 기법


모든 종류의 dbms에 적용 가능한 공격 기법




예) 악성 스크립트의 실행, 외부 프로그램의 사용, 불법 로그인, db 정보 열람, 추가,수정,삭제


프로시저를 통한 운영체제 명령어 수행



#sql 취약점 진단



form based sql 인젝션 진단



정적 쿼리 구조를 이용하여 sql 실행




명령어 인젝션 취약점 개요























































보안이슈 및 개발보안의 필요성1



취약한 애플리케이션 원인 70% - 80%


분석 => 설계 =>  개발 => 테스트 =>  배포 =>  운영


sql 인젝션 취약점


xss 취약점(크로스 사이트 스크립팅) - 이메일 본문에 스크립트 명령어를 삽입하여

본문을 열람하기만 하여도 악성 코드에 감염 될 수 있다.


시큐어 코딩 적용하면 94% 정도 해킹 감소


웹 애플리케이션 보안의 필요성 


침해사고 사례를 통해 시큐어 코딩의 필요성 설명 


소프트웨어 보안 약점과 취약점 정보 활용가능


행정자치부의 소프트웨어 개발보안 가이드를 활용가능


소프트웨어 개발보안 방법론을 설명 할 수 있음



보안 솔류션 


종류


한계




방화벽이나 ids /ips 같은 보안 장비를 구축해서


원격으로 시스템의 취약한 서비스를 이용한 공격은 사실상 어려움



해커들은 웹 포트 80번을 집중적으로 공략



안전한 웹보안을 보장하기 쉽지 않음 -  기업마다 서비스 환경이 다르기 때문



웹 기반 공격 유형


1차 해킹 - 외부망 통한 해킹   > 웹서버의 취약점을 공격하는 방법과 내부 pc를 공격하는 방법이 있음


웹서버 해킹은 웹사이트를 통해 이루어지며 sql 인젝션이나 파일 업로드 취약점과 같은 웹 애플리케이션의 취약점 공격을 시도 하고

관리자 계정을 확보해서 내부시스템으로 침투할 수 있는 발판을 만드는 방식


2차 해킹 - 내부망 통한 해킹 -> 내부사용자의 실수로 웹사이트나 메일을 통해 악성코드가 설치되도록 하는 것




보안 종류 - 네트워크 보안, 클라이언트 보안, 애플리케이션 보안, 데이터베이스 보안


- 네트워크 보안 


- 시스템 보안 


- 애플리케이션 보안



 kisa 분석결과 네트워크 보안 장비인 방화벽이나 ids/ips는 정의된 룰이나

시그니처를 이용하여 안전하지 않은 패킷을 필터링하는 정책을 사용한다.

하지만 포트 스캔, dos, 잘못관리된 룰셋, 새로운 패턴의 공격으로 3.5%의 침해사고가 발생하고 있다.

웹 방화벽도 공격에 사용된 데이터의 시그니쳐를 룰로 정의 하여 해당 패턴의 요청의 패턴을 차단하게 되는데

잘 알려진 애플리케이션 레벨의 공격은 잘 차단하고 있지만, 새로운 공격 패턴이나 룰 관리 부실로 인한 침해 사고율이 10% 정도 된다.



악성코드 유입량의 지속적인 증가. 예) 이메일


침해사고 사례














보안약점 vs 보안 취약점



보안약점 : 소프트웨어에서 해킹등 실제 보안사고에 악용될 수 있는 보안 취약점의 근본원인


보안취약점: 소프트웨어 실행 시점에 여러개의 보안 약점중 실제 침해사고의 원인이 되는 그 보안 약점


예방책: 시큐어 코팅


25가지 보안약점 정리 한것 : CVE 목록 - os, 매년 8천여개 목록이 추가됨. (발견된 보안 취약점의 history)



cwe : 소프트웨어의 보안 약점을 사전식으로 관리 하고 미국토안보부에서 관리한다.


수집된 보안약점을 뷰 카테코리 취약점 복합요소 별로 볼 수 있다.


일반적인 취약점의 분류체계



owasp top 10 : 운영중인 웹서버에 발생되는 가장 많은 침해 사고 유형을 정리한 리스트 


애플리케이션 보안을 전문으로 하는 7개 기업의 8개 데이터 세트를 토대로 함.


취약점 공격 가능성, 탐지 가능성, 영향평가 등을 고려하여 가장 많이 퍼져 있고,

위험도가 큰 상위 10개를 선정했다.

리스트의 순서가 중요도 , 빈도와 심각성을 반영하고 있어서 개발자들이 쉽게 위험도를 확인 할 수 있다.


소프트웨어 개발 보안 가이드 주요 내용


입력 데이터 검증 및 표현


보안기능


시간 및 상태

에러 처리


코드오류


api 오용











































스프링 기초 DI 예제2


코드의 변경 없이 xml 설정만으로 개발자가 원하는 객체의 주입으로 바꿀 있음.

   

   

   [의존성 주입 종류]

    setter(설정 메소드) 이용한 주입 

    : 설정 메소드를 사용해서 의존성을 주입하는

    

    Constructor(생성자) 통한 주입

    : 생성자를 사용해서 의존성을 주입하는

   

   

   [의존성 주입(DI) 장점]

DI 사용하면 개발 계획시에 시간이 요구가 되지만, 규모가 프로젝트에서 유지보수 업무를 

한다면 DI 개발의 장점을 느낄 있다.  




예제1)















예제2)





















'매일코딩 > Spring' 카테고리의 다른 글

스프링 기초 DI 예제 4  (2) 2018.07.17
스프링 기초 DI 예제 3  (0) 2018.07.17
스프링 기초 DI 예제2  (0) 2018.07.16
스프링 기초 DI 예제1  (0) 2018.07.16
31.스프링프로젝트 - 조회  (0) 2016.11.21
30.스프링프로젝트 - 답변  (0) 2016.11.21

+ Recent posts

티스토리 툴바